问题描述
我有一个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;