2017-02-14 2 views

ответ

2

Предполагая, что вам нужно для перехода ДИНАМИКА

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 (если вам НЕ нужны Dynamic)

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

Смежные вопросы