2013-06-04 16 views
2
Lab Test Name Source Collected Date Results 
Urea    6/4/2013 12:00:00 AM   5 
Uric Acid  6/4/2013 12:00:00 AM   10 
Cholesterol  6/3/2013 12:00:00 AM   25 

我有一個具有上述值的數據表。
我需要將其旋轉至以下結構:如何在數據透視表中執行SQL

     Urea Uric Acid Cholesterol 
6/4/2013 12:00:00 AM  5   10    - 
6/3/2013 12:00:00 AM  -   -   25 
+4

你試過[pivot](http://msdn.microsoft.com/en-us/library/ms177410(v = sql.105).aspx) –

+1

[你有什麼試過?](http:// mattgemmell.com/2008/12/08/what-have-you-tried/) – Kash

回答

3

如果你看一下通過的Mikael鏈接的答案,你會意識到你將需要動態生成的列數據透視聲明自PIVOT語法沒有按在FOR子句中不允許子查詢。所以基本上你需要做的是這樣的:

DECLARE 
@cols AS NVARCHAR(MAX), 
@y AS INT, 
@sql AS NVARCHAR(MAX); 

-- Construct the column list for the IN clause 
-- e.g., [Urea],[Uric Acid],[Cholesterol] 
SET @cols = STUFF(
(SELECT N',' + QUOTENAME(y) AS [text()] 
FROM (SELECT DISTINCT (LabTestName) AS y FROM YourTable) AS Y 
ORDER BY y 
FOR XML PATH('')), 
1, 1, N''); 

現在,您可以建立自己的PIVOT語句這樣:

set @SQL = N' 

SELECT SourceCollectedDate,'[email protected]+N' 
FROM YourTable 
PIVOT (
SUM(results) FOR LabTestName IN ('[email protected]+N') 
) AS PivotTable 
ORDER BY SourceCollectedDate desc 
' 

並執行它:

EXEC sp_executesql @sql 

將產生:

SourceCollectedDate  Urea Uric Acid Cholesterol 
2013-06-04 00:00:00.000 5  10   NULL 
2013-06-03 00:00:00.000 NULL NULL  25 

請注意,我的例子有YourTable作爲表名。你需要用你的實際表名替換它。

SQL Fiddle(基於斷什麼乍得創建)

1

這裏不需要pivot或動態SQL的解決方案。權衡是你需要在查詢中指定每個可能的實驗室測試名稱。

SELECT [Source Collected Date], 
    MAX(CASE WHEN [Lab Test Name] = 'Urea' 
     THEN Results ELSE NULL END) AS Urea, 
    MAX(CASE WHEN [Lab Test Name] = 'Uric Acid' 
     THEN Results ELSE NULL END) AS [Uric Acid], 
    MAX(CASE WHEN [Lab Test Name] = 'Cholesterol' 
     THEN Results ELSE NULL END) AS Cholesterol 
FROM Table1 
GROUP BY [Source Collected Date] 

看到它工作here

+0

問題是,你不能假設實驗室測試名稱列表只有這些3.如果是這樣的話,你可以寫沒有動態SQL的PIVOT語句也是如此! – Icarus

+1

@ Icarus - true,但如果只有少量可能的實驗室測試名稱,這是一個合理的選項。 – Chad

+0

我同意;如果你知道要旋轉的列的數量很小,並且它們是事先知道的,那麼我肯定會做這樣的事情,但仍然更喜歡PIVOT語法。 – Icarus