2012-07-04 70 views
4

請考慮此表:如何列轉換爲列在SQL Server

ID   Page   Line   C01   C02   C03   
--------------------------------------------------------------------- 
1   122   11    1   0   1 
1   123   11    1   1   1 
1   124   12    0   0   0 
1   125   16    1   0   1 
1   127   11    0   1   0 

我想這個表格轉換成這一個:

ID   Page   Line   City   Value 
----------------------------------------------------------- 
1   122   11   C01   1   
1   122   11   C02   0 
1   122   11   C03   1 
1   123   11   C01   1 
1   123   11   C02   1 
1   123   11   C03   1 
... 

我怎麼能以適當的方式做到這一點?

回答

7

使用UNPIVOT。嘗試類似於:

SELECT ID, Page, Line, City, Value 
FROM SourceTable 
UNPIVOT 
    (Value FOR City IN 
     (C01, C02, C03) 
)AS unpvt; 

其中'SourceTable'是您的源表名稱。 (注:我不能在此刻測試這一點,所以它可能不會是完全正確的。)

全部細節在這裏:http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

0

做一個自加入,每個1 + N列一次。並創建一個笛卡爾表。

自連接將自己連接到同一個表。通過ID,頁面和行匹配它。

0

下面的查詢應該做你的要求。

SELECT ID, PAGE, LINE, "C01", C01 FROM TABLE 
UNION 
SELECT ID, PAGE, LINE, "C02", C02 FROM TABLE 
UNION 
SELECT ID, PAGE, LINE, "C03", C03 FROM TABLE 
+0

我猜的想法必須具備一般清晰,但:1)在Transact-SQL,雙引號用於分隔*名稱*(默認情況下,無論如何)。要分隔字符串常量,可以使用* single *引號。 2)UNION刪除重複的行。即使重複的可能性不大(例如在這種情況下),查詢計劃可能仍然包括刪除它們的步驟,這很可能是性能問題。改爲使用UNION ALL。 3)應該爲最後兩列提供別名。 –

+0

謝謝Andriy的澄清。欣賞它。 – Senthil