在这里使用TSQL 2012,基本上我有一个如下所示的数据集:
Period Values OtherValues SiteName MoreColumns
1 12 45 Site 1 34
2 34 6 Site 1 346
2 56 79 Site 1 345
3 3 78 Site 1 67
3 4 67 Site 1 8
我想要返回的是一个在网站上分组的数据集,并根据他们反对的时间段汇总所有其他列。
Site P1V P2v P3V P1OtherV P2OtherV P3OtherV
Site 1 12 90 7 45 85 145
我知道我可以用以下风格的案例来做:
SELECT CASE WHEN Period = '1' THEN Sum(Values) As P1Values,
CASE WHEN Period = '2' THEN Sum(Values) As P2Values,
CASE WHEN Period = '3' THEN Sum(Values) As P3Values
.....
但肯定有更优雅的解决方案吗?对于7列,数据集应该返回三个总和(对于每个时期),因此总共21个总和,有可能增长。
答案 0 :(得分:0)
您可以使用PIVOT并使用UNION
创建源表WITH T1 AS
(
SELECT Period + 'SapValues' as Period, SapValues as Value, SiteName FROM T
UNION ALL
SELECT Period + 'OtherValues' as Period, OtherValues as Value, SiteName FROM T
)
SELECT *
FROM T1
PIVOT
(
Sum(Value)
FOR Period IN ([P1SapValues],[P2SapValues],[P3SapValues],
[P1OtherValues],[P2OtherValues],[P3OtherValues])
) AS PivotTable;
答案 1 :(得分:0)
我会使用UNPIVOT / PIVOT序列:
SELECT * FROM
(
SELECT Period+Col Period, SiteName, Value FROM
Src UNPIVOT (Value FOR Col IN (SapValues,OtherValues)) U
) U
PIVOT (SUM(Value) FOR Period IN (P1SapValues,P2SapValues,P3SapValues,
P1OtherValues,P2OtherValues,P3OtherValues)) P