SQL Pivot - 添加另一列

时间:2014-05-09 16:05:39

标签: sql-server tsql sql-server-2008-r2 pivot

我认为我需要的是创建一个数据透视表。我可以在没有劳动时间列的情况下完成,但是当我尝试使用劳动时间列创建它时,它不起作用。

请您告诉我如何获得我要求的结果?

还有多个“Par”值,下面没有显示。

这是我的表:

WorkDate    Par QTY laborhrs
03/14/14    CR  100 0.67
03/25/14    ET  100 0.73
03/05/14    CR  50  0.37
03/13/14    ER  50  0.72
03/04/14    YD  400 1.68
03/25/14    CR  200 0.8
03/25/14    CR  300 1.5

这就是我想要的:

WorkDate    CR  CRHours ER  ERHours ET  ETHours YD  YDHours
03/04/14    0   0       0   0       0   0       400 1.68
03/05/14    50  0.37    0   0       0   0       0   0
03/13/14    0   0       50  0.72    0   0       0   0
03/14/14    100 0.67    0   0       0   0       0   0
03/25/14    500 2.3     0   0       100 0.73    0   0

新的“小时”列来自每个“par”的劳动者列

2 个答案:

答案 0 :(得分:1)

有多种方法 您可以创建两个PIVOT子查询并加入它们,但我更喜欢这种方式

SELECT
t.WorkDate
,SUM(CASE WHEN t.Par='CR' THEN t.Qty ELSE 0 END) AS CR
,SUM(CASE WHEN t.Par='CR' THEN t.laborhrs ELSE 0 END) AS CRHours

,SUM(CASE WHEN t.Par='ER' THEN t.Qty ELSE 0 END) AS ER
,SUM(CASE WHEN t.Par='ER' THEN t.laborhrs ELSE 0 END) AS ERHours

,SUM(CASE WHEN t.Par='ET' THEN t.Qty ELSE 0 END) AS ET
,SUM(CASE WHEN t.Par='ET' THEN t.laborhrs ELSE 0 END) AS ETHours

,SUM(CASE WHEN t.Par='YD' THEN t.Qty ELSE 0 END) AS YD
,SUM(CASE WHEN t.Par='YD' THEN t.laborhrs ELSE 0 END) AS YDHours

GROUP BY t.WorkDate
FROM [tablename] t

我发现这是解决这些问题的最快方法,因为它只需要遍历一次。

答案 1 :(得分:0)

另一个选项是相关查询:

select workdate,
(select sum(qty) from labour a where a.workdate=b.workdate and a.par='CR') CR,
(select sum(laborhrs) from labour a where a.workdate=b.workdate and a.par='CR') CRhours,
(select sum(qty) from labour a where a.workdate=b.workdate and a.par='ER') ER,
(select sum(laborhrs) from labour a where a.workdate=b.workdate and a.par='ER') ERhours,
(select sum(qty) from labour a where a.workdate=b.workdate and a.par='ET') ET,
(select sum(laborhrs) from labour a where a.workdate=b.workdate and a.par='ET') EThours,
(select sum(qty) from labour a where a.workdate=b.workdate and a.par='YD') YD,
(select sum(laborhrs) from labour a where a.workdate=b.workdate and a.par='YD') YDhours
from yourtable b
group by workdate