SQL - 在具有多个聚合的一列上旋转的返回数据集

时间:2016-09-15 08:36:29

标签: sql tsql pivot

在这里使用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个总和,有可能增长。

2 个答案:

答案 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