对聚合列进行逆透视
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
我现在尝试了 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