2015-11-25 21 views
2

如何在SQL Server中編寫一個查詢,爲每個唯一ID的每個變量返回一列?以下是我想要完成的一個簡化示例。你能指出我朝着正確的方向嗎?如何建立一個將行選入SQL列的查詢?

Table_Exists

ID | LOCATION | STATUS 
__________________________________ 
001 |  top  |  3 
001 |  mid  |  1 
001 |  bot  |  4 
002 |  top  |  2 
002 |  mid  |  2 
002 |  bot  |  1 
003 |  top  |  1 
003 |  mid  |  4 
003 |  bot  |  2 

這裏是我想做一個簡單的例子,顯然沒有成功。下面的代碼返回周邊的語法不正確 '=' 的錯誤信息:

SELECT 
    ID, 
    LOCATION = top AS Top, 
    LOCATION = mid AS Middle, 
    LOCATION = bot AS Bottom 
FROM 
    Table_Exists 

我試圖建立:

Table_Desired

ID | Top | Middle | Bottom 
__________________________ 
001| 3 | 1 | 4 
002| 4 | 2 | 2 
003| 1 | 4 | 2 
+1

它被稱爲[數據透視查詢](https://technet.microsoft.com/en-us/library/ms177410%28v=sql.105%29.aspx)... –

+0

看看樞軸命令。 http://stackoverflow.com/questions/18116020/sql-server-2008-vertical-data-to-horizo​​ntal – domenicr

回答

3

您可以使用自聯接(只要您的LOCATIONNOT NULL,它包含所有值:)

SELECT t1.ID, t1.Status AS Top, t2.Status AS Middle, t3.Status AS Bottom 
FROM Table_Exists t1 
JOIN Table_Exists t2 
    ON t1.ID = t2.ID 
    AND t1.LOCATION = 'top' 
    AND t2.Location = 'mid' 
JOIN Table_Exists t3 
    ON t1.ID = t3.ID 
    AND t1.LOCATION = 'top' 
    AND t3.Location = 'bot'; 

LiveDemo

更多通用的解決方案使用PIVOT

SELECT 
    [ID] 
    ,[Top] = [top] 
    ,[Middle] = [mid] 
    ,[Bottom] = [bot] 
FROM #Table_Exists t 
PIVOT (
    MAX(STATUS) FOR LOCATION IN ([top],[mid],[bot]) 
) AS Piv 

LiveDemo2

+0

謝謝@ lad2025這是非常有幫助 –

+0

如果「狀態」的任何值爲0/null整行「ID」將被排除。 如果Table_Exists缺少數據,當「Status」爲0/null時,PIVOT函數可用於返回「ID」行 –

+0

@BretShandro查看更新 – lad2025

2

使用旋轉功能這樣

SELECT 
    ID, 
    [top] AS [Top], 
    [mid] AS Middle, 
    [bot] AS Bottom 
FROM(SELECT 
    ID, 
    LOCATION, 
    STATUS 
FROM 
    Table_Exists) AS SourceTable 
PIVOT (AVG(STATUS) FOR LOCATION IN ([top],[mid],[bot])) AS PivotTable 
+0

我收到錯誤消息「將數據類型nvarchar轉換爲int時出錯。 有什麼想法? @Mihai –

+0

你的Status列是一個nvarchar嗎?如果是這樣,然後CAST(STATUS,INT)AS STATUS將讓平均 –

相關問題