2012-01-26 80 views
0

我知道這可能是我完全如此得太多這裏一個簡單的問題,有云:動態SQL列

我有以下的列的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)是'VACATION',則小時(T1)在假期(T2)中被累計,如果標籤(T1)
- 如果標籤(T1)是 '個人',然後時間(T1)在個人(T2)得到總結 - OTHours(T1)是總結了在所有條目爲OT(T2)

在我的第一嘗試,我自己加入了表格,但得到了重複的結果。定期,休假,個人和OT加入多次相同的勞務交易。我正在使用MS SQL創建第二個表。任何和所有的幫助,非常感謝!謝謝!

+1

聽起來就像您正在尋找PIVOT操作員! http://msdn.microsoft.com/en-us/library/ms177410.aspx –

+1

檢出'PIVOT'。您需要命名列(即不能*動態地*查詢調整爲在「標籤」列中更改數據)。 – Yuck

+0

@Yuck:我有嚴格的標籤值,所以硬編碼不是問題!我一定會考慮它! –

回答

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 
+0

完美!這正是我需要的! –

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

+0

我很欣賞答案,而且PIVOT表格絕對是一種選擇。由於這是在一個不允許使用PIVOT sql語句的報告中使用的,我決定使用RedFilter的答案。感謝您的建議! –

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 

這不是完全動態。如果您創建不同的標記值,則不會創建新列。您將不得不爲新列創建代碼。

+0

沒關係。我接受RedFilter對你的回答,因爲它早了5分鐘,實際上它更適合一點(標籤只是空白,而不是NULL)。雖然我很欣賞答案! –