对聚合列进行逆透视

Unpivot on aggregated columns

我现在尝试了 3 天来格式化 sql 输出,以便我可以将其放入 excel sheet 和 PHPExcel 尽可能少的步骤(因为我要生成一个非常大的 Excel sheet)

我正在使用 SQL SERVER 2005

这是我在不使用任何枢轴的情况下得到的结果(因为我不知道该怎么做..)

- [cause]                  |[nb]| [Value]

- CASSE                    | 20 |  8568,74
- DELEGATION SIGNATURE     |  2 |  1268,96
- ERREUR DE LIVRAISON      |  8 |  1654,64
- INTERNE                  | 10 |  3145,7
- PERTE                    | 94 | 26255,08
- SPOLIATION               |  2 |   420
- VOL                      | 41 |  5747,76

所以现在我想要得到的是这样的东西:

- [cause]                |  [Value]

- CASSE                  |   20
- CASSE                  | 8568,74
- DELEGATION SIGNATURE   |    2
- DELEGATION SIGNATURE   | 1268,96
- ...

这是我所做的:

 SELECT 
        l1.Litige_Cause AS [cause], count(l2.Litige_Ref) AS [nb], 
      sum(lc.LitigeCProduit_Valeur) as [value]
    FROM 
       LitigeCordon l1 
     LEFT JOIN LitigeCordon l2 
       ON l1.Litige_Ref = l2.Litige_Ref
       AND YEAR(l2.Litige_DateEnvoi) = 2014 AND MONTH(l2.Litige_DateEnvoi) = 01
       INNER JOIN LitigeCProduit lc
       ON l1.Litige_Ref = lc.Litige_Ref
       AND YEAR(l2.Litige_DateEnvoi) = 2014 AND MONTH(l2.Litige_DateEnvoi) = 01         GROUP BY l1.Litige_Cause

好吧,必须承认我不是很擅长SQL,我还是个学生,在学校学到的东西也只是基础知识。所以我的问题是:有可能吗?如果是的话,你能给我一个建议吗,因为我不只是在寻找一个原始答案,我想更多地了解 pivot / Unpivot 函数是如何工作的,我已经尝试了很多东西但它从来没有像想要的那样工作...

谢谢!


编辑: 对于那些可能感兴趣的人,我对@NoDisplayName 的答案做了一些更改,结果如下所示:

- [cause]                Type |  [Value]

- CASSE                    NB |   20
- CASSE                  Value| 8568,74
- DELEGATION SIGNATURE     NB |    2
- DELEGATION SIGNATURE   Value| 1268,96
- ...

我只添加了 "type" 列和 "type" 的逆透视数据,而不是 "col"

  SELECT cause, type,
   data as Value
  FROM  (SELECT cause,
            CONVERT(VARCHAR(50), nb) nb1,
            CONVERT(VARCHAR(50), value) value1
         FROM   Yourtable) a
  UNPIVOT(data
            FOR type IN([nb1],
                       [value1]))unpiv 

希望这也有帮助:)

我将使用 Cross Apply 简单的方法来 Unpivot 您的数据

SELECT cause,
       cs.value
FROM   yourtable
       CROSS apply(VALUES (value),
                          (CONVERT(VARCHAR(50), nb))) cs (value)

或者您也可以使用 Unpivot

SELECT cause,
       data as Value
FROM  (SELECT cause,
                CONVERT(VARCHAR(50), nb) nb1,
                value
        FROM   Yourtable) a
        UNPIVOT(data
                FOR col IN([nb1],
                           [value]))unpiv 

FIDDLE DEMO

这也应该有效:

SELECT l1.Litige_Cause AS [cause], count(l2.Litige_Ref) AS [nb] FROM LitigeCordon l1
UNION ALL
SELECT l1.Litige_Cause AS [cause], sum(lc.LitigeCProduit_Valeur) as [value] FROM LitigeCordon l1
ORDER BY l1.Litige_Cause