2016-09-15 21 views
3

使用TSQL 2012这里,基本上我有一个数据集,看起来像下面这样:SQL - 返回数据集枢接一列多聚集

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

我会用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 
+0

优秀。作品一种享受。 – fl3rgle

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;