2013-03-19 41 views
2

對不起,缺乏信息的 - SQL Server 2008的SQL逆透視及插入

我掙扎着爬從表格中的一對夫婦的列值到一個新的行表B中的每一行的A,其中一列不爲空。

表A的結構爲:

UserID | ClientUserID | ClientSessionID | [and a load of other irrelevant columns) 

表B:

UserID | Name | Value 

我想每個非空ClientUserID或ClientSessionID在create表B中的行 - 使用列名作爲B的「名稱」,列值作爲「B的值」。

我很努力地寫出我的「unpivot」語句 - 只是讓語法正確!我試圖用一些樣品跟着一起,但不能

這裏是我的SQL查詢迄今爲止 - 任何進一步的幫助,將不勝感激(剛開這個SELECT是令人沮喪的我,更別說做插入!)

SELECT UserID, ClientUserID, ClientSessionID FROM websiteuser WHERE ClientSessionID IS NOT null 

這給了我需要執行操作的行 - 但我無法獲得UNPIVOTing這些數據並將其轉換爲我的插入的正確語法。

+1

您使用的是什麼版本的SQL?您的untivot版本有哪些錯誤? – 2013-03-19 13:50:44

+2

請通過添加適當的標籤(Oracle,SQL Server,MySQL等)來指定您要定位的RDBMS。可能會有利用不被普遍支持的語言或產品功能的答案。此外,通過使用特定的RDBMS標記它,您的問題可能會從更適合回答問題的人那裏得到關注 – Taryn 2013-03-19 13:55:38

回答

3

您可以通過使用UNION獲得每個新行UNPIVOT以這種方式記錄:

INSERT INTO TableB (UserID, Name, Value) 
SELECT UserID, 'ClientUserID' AS Name, ClientUserID AS Value 
FROM TableA 
WHERE ClientUserID IS NOT NULL 
UNION ALL 
SELECT UserID, 'ClientSessionID' AS Name, ClientSessionID AS Value 
FROM TableA 
WHERE ClientSessionID IS NOT NULL 

我在這種情況下,UNION使用UNION ALL意味着整個集DISTINCT操作,通常情況下應該是不必要的當轉動唯一記錄時。

如果您的ClientUserID和ClientSessionID列不是相同的數據類型,您可能必須將其中一個或兩個轉換爲相同的數據類型。

+0

非常感謝Tim - 我非常喜歡使用Unpivot來解決這個問題。您的查詢工作出色 - 再次感謝:) – 2013-03-19 17:30:33