我知道这可能是一个简单的问题,我完全过分思考,所以这里是:
我有一个包含以下列的LaborTransaction表:(表1)
Laborcode | Hours | OTHours | Tag
JSMITH | 2.0 | 0.0 | VACATION
JSMITH | 4.0 | 3.0 | PERSONAL
JSMITH | 3.0 | 0.0 | VACATION
JSMITH | 5.0 | 1.0 |
JSMITH | 7.0 | 4.0 |
我需要生成下表:(表2)
Laborcode | Regular | Vacation | Personal | OT
JSMITH | 12.0 | 5.0 | 4.0 | 8.0
基本上,我只需要总结所有人工交易并检查标签 - 如果标签(T1)为空白,则小时(T1)在常规(T2)中汇总 - 如果Tag(T1)为'VACATION',则在Vacation(T2)中将小时数(T1)相加 - 如果Tag(T1)为'PERSONAL',则小时(T1)在个人(T2)中总结 - OTHours(T1)在所有条目中总计为OT(T2)
在我的第一次尝试中,我自己加入了表格,但结果却是重复的。 Regular,Vacation,Personal和OT多次添加相同的人工交易。我正在使用MS SQL创建第二个表。非常感谢任何和所有的帮助!谢谢!
答案 0 :(得分:3)
select Laborcode,
sum(case when Tag = '' then Hours end) as Regular,
sum(case when Tag = 'VACATION' then Hours end) as Vacation,
sum(case when Tag = 'PERSONAL' then Hours end) as Personal,
sum(OTHours) as Overtime
from LaborTransaction
group by Laborcode
答案 1 :(得分:1)
您可以使用CASE使用手动数据透视表执行此操作,也可以使用SQL Server 2005及更高版本的PIVOT功能。
如果标签可能会发生变化,您可以使用动态SQL生成列:
SQL Server 2005 Pivot on Unknown Number of Columns
答案 2 :(得分:1)
Select
LT.Laborcode
, Sum(case when NullIf(LT.Tag, '') Is Null then Hours end) as Regular
, Sum(case when LT.Tag = 'VACATIION' then Hours else end) as Vacation
, Sum(case when LT.Tag = 'Personal' then Hours else end) as Personal
, Sum(LT.OTHours) as OverTime
from LaborTransaction as LT
Group by LT.Laborcode
这不是完全动态的。如果创建不同的Tag值,则不会创建新列。您必须为新列创建代码。