2016-04-15 31 views
0

我已經建立了一個查詢,輸出像幾千行:SQL服務器 - 表換位/透視

| Person | Date  | Hours1 | Hours2 | 
    Steve 2016 04  18   42.0 
    John  2016 04  21   32.09 
    Pete  2016 04  9   78.5 
    Steve 2016 03  10   10 
    Dave  2016 03  5   50 
    etc... etc...  etc...  etc... 

但我需要:

|Person | 2016 04 Hours1 | 2016 04 Hours2 | 2016 03 Hours1 | 2016 03 Hours2 | etc... 
Dave   NULL    NULL    5    50   etc...    
John   21    32.09    NULL   NULL   etc... 
Pete   9    78.5    NULL   NULL   etc... 
Steve   18    42.0    10    10   etc... 
etc...   etc...   etc...   etc...   etc...  etc... 

我看了一下其他問題等等,但是我不確定這是一個簡單的用例,因爲有大量的日期和人員,但我真的不知道從哪裏開始!

+0

創建一個動態的SQL查詢和執行 – Wanderer

回答

3

創建一個動態查詢並執行它。

查詢

declare @sql as varchar(max); 

select @sql = 'select Person,' + stuff((
    select distinct 
    ',max(case [Date] when ''' + [Date] + ''' then Hours1 end) as [' + [Date] + ' Hours1]' + 
    ',max(case [Date] when ''' + [Date] + ''' then Hours2 end) as [' + [Date] + ' Hours2]' 
from Person 
for xml path('')), 1, 1, ''); 

select @sql += ' from Person group by Person;'; 

exec(@sql); 

結果

+--------+----------------+----------------+----------------+----------------+ 
| Person | 2016 03 Hours1 | 2016 03 Hours2 | 2016 04 Hours1 | 2016 04 Hours2 | 
+--------+----------------+----------------+----------------+----------------+ 
| Dave | 5    | 50    | NULL   | NULL   | 
| John | NULL   | NULL   | 21    | 32.09   | 
| Pete | NULL   | NULL   | 9    | 78.5   | 
| Steve | 10    | 10    | 18    | 42    | 
+--------+----------------+----------------+----------------+----------------+ 
+0

偉大的解決方案;用另一個sql創建dyn sql。簡單而直接。 –

+0

這對我來說是完美的,雖然我必須承認我不知道如何!看起來我需要找到一個關於動態SQL的好課程。 – TimJ

0

在SQL Server中沒有通用數據透視功能。您可能需要創建動態SQL語句,或者需要處理客戶端應用程序中的數據。

+0

比方說,我想建立的,而不是靠前端的動態SQL,你哪來開始? – TimJ