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
在这里使用 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
制作源代码 tableWITH 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