动态SQL列

时间:2012-01-26 19:49:16

标签: sql tsql

我知道这可能是一个简单的问题,我完全过分思考,所以这里是:

我有一个包含以下列的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创建第二个表。非常感谢任何和所有的帮助!谢谢!

3 个答案:

答案 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

Pivot Table and Concatenate Columns

PIVOT in sql 2005

答案 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值,则不会创建新列。您必须为新列创建代码。