PIVOT汇总数据

问题描述

我有一个sql临时表(#tmpProdData),其数据格式如下:

TransAmount | CommAmount | Role1 | Role2 | ... | Role20
100.00      | 15.00      | 123   | 123   | ... | 456
200.00      | 60.00      | 123   | 456   | ... | 456
250.00      | 25.00      | 456   | 789   | ... | 789

Role1到Role20列具有员工ID(int)。我需要一个如下所示的结果表(#tmpEmpTotals):

EmpID | Role1TransTotal | Role1CommTotal | Role2TransTotal | Role2CommTotal | ... | ... | Role20TransTotal | Role20CommTotal
123   | 300.00          | 75.00          | 100.00          | 15.00          | ... | ... | 0.00             | 0.00
456   | 250.00          | 25.00          | 200.00          | 60.00          | ... | ... | 300.00           | 75.00
789   | 0.00            | 0.00           | 250.00          | 25.00          | ... | ... | 250.00           | 25.00

处于任何角色的每个员工都应该有1个条目,然后分别具有SUM(TransAmount)和SUM(CommAmount)。因此,如果员工123在#tmpProdData表的Role1中,则将其添加到Role1TransTotal和Role1CommTotal的总计中。一名员工可能在同一记录中担任多个职位。

在样本中,您可以看到雇员123在第一条记录和第二条记录中都在role1中,因此他的Role1CommTotal是记录1和2的CommAmount之和。

我觉得PIVOT在这里会有所帮助,但是我似乎无法使其正常工作。我目前可以使用子选择的SUM来做到这一点,但我知道这效率很低。任何帮助都将不胜感激!

解决方法

嗯。 。 。您要取消透视并重新聚合吗?

select v.empid,sum(case when v.rnum = 1 then t.commamount end) as role1commission,sum(case when v.rnum = 2 then t.commamount end) as role2commission,. .  
from #tmpProdData t cross apply
     (values (1,role1),(2,role2),. . . 
     ) v(rnum,empid)
where v.empid is not null
group by v.empid;