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

SQL - Return dataset pivoted on one column with multiple aggregates

在这里使用 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

我想要 return 的是一个数据集,该数据集在站点上分组并根据它们所针对的时间段对所有其他列求和。

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
       .....

但是肯定有更优雅的解决方案吗?数据集应 return 7 列的三个总和(每个周期),因此总共有 21 个总和,并有增长的潜力。

您可以使用 PIVOT 并使用 UNION

制作源代码 table
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;

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