2016-09-15 51 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;