2017-02-14 65 views
1

我有一個像下面的表...SQL服務器 - 多聚集透視表

Serv nm Mnth sc se 
F  01 Jan 100 5 
M  01 Jan 200 2 
A  01 Jan 100 7 
F  02 Feb 200 3 
A  02 Feb 100 3 

我怎麼會變換像....

nm Mnth SumF(sc) SumF(se) SumM(sc) SumF(se) SumA(sc) SumA(se) 
01 Jan 100  5   200  2  100  7 
02 Jan 200  3   NULL  NULL  100  3 

回答

2

假設你需要去DYNAMIC

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName('Sum'+Serv+'(sc)')+','+QuoteName('Sum'+Serv+'(se)') From Yourtable Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [nm],[Mnth],' + @SQL + ' 
From (
     Select [nm] 
       ,[Mnth] 
       ,C.* 
     From YourTable A 
     Cross Apply (Values (''Sum''+A.Serv+''(sc)'',A.sc) 
          ,(''Sum''+A.Serv+''(se)'',A.se) 
        ) C (Item,Value) 
    ) A 
Pivot (sum(Value) For [Item] in (' + @SQL + ')) p' 
Exec(@SQL); 

返回

enter image description here

生成的SQL(如果您不需要動態)

Select [nm],[Mnth],[SumA(sc)],[SumA(se)],[SumF(sc)],[SumF(se)],[SumM(sc)],[SumM(se)] 
From (
     Select [nm] 
       ,[Mnth] 
       ,C.* 
     From YourTable A 
     Cross Apply (Values ('Sum'+A.Serv+'(sc)',A.sc) 
          ,('Sum'+A.Serv+'(se)',A.se) 
        ) C (Item,Value) 
    ) A 
Pivot (sum(Value) For [Item] in ([SumA(sc)],[SumA(se)],[SumF(sc)],[SumF(se)],[SumM(sc)],[SumM(se)])) p 
+0

謝謝!好的解決方案 –

+0

@AndyL。很高興它有幫助 –

1

你可以先unpivot的價值得到兩個SE和SC在同一然後做一個像這樣的支點:

select * 
from (
select 
    serv+'_'+t serv, nm, mnth, s 
from t 
cross apply (
    values 
     ('sc', sc), 
     ('se', se) 
    ) x (t, s) 
) t pivot (
    sum(s) for serv in (
     [F_sc],[F_se], 
     [M_sc],[M_se], 
     [A_sc],[A_se] 
    ) 
) as p; 

產地:

enter image description here