在聚合列上取消透视

时间:2015-01-16 14:38:25

标签: sql-server aggregate unpivot

我现在尝试3天来格式化sql输出,这样我就可以把它放在带有PHPExcel的excel表中,尽可能少的步骤(因为我有一个非常庞大的Excel表格来生成)

我正在使用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,我还是学生,而我在学校学到的几乎不是基础知识。所以我的问题是:它甚至可能吗?如果是的话,你可以给我一个建议,因为我不是只搜索一个原始的答案,我想更多地了解枢轴/ Unpivot功能是如何工作的,我已经尝试了很多东西,但它从来没有像想... ...

谢谢!


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

- [cause]                Type |  [Value]

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

我只添加了列"键入" " type"和#34;"而不是" 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 

希望这也有帮助:)

2 个答案:

答案 0 :(得分:0)

我将使用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

答案 1 :(得分:0)

这也应该有效:

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