2011-12-17 29 views
1

我創建DTS - 在SSIS包:SQL轉換表結構

表users_properties:

 
[id] [user_id] [prop_name] [prop_value] 
1 1   LastName Hendrix 
2 1   FirstName John 
3 2   LastName Adamson 
4 2   FirstName Smith 
5 2   Age   28 

我怎樣才能獲得表這種結構:

 
[user_id] [LastName] [FirstName] [Age] 
1   Hendrix  John 

是它例如,通過case-statement或Visual Studio中的組件,可以不用JOIN(perfomance !!!)來做到這一點?請告知如何做到這一點。

+3

不確定爲什麼你認爲'JOIN's會導致性能問題。 [與適當的指標,這可能會有效或比pivoting更多。](http://stackoverflow.com/questions/7448453/sql-server-pivot-vs-multiple-join/7449213#7449213) – 2011-12-17 14:43:19

回答

2

使用CASE語句...

SELECT 
    user_id, 
    MAX(CASE WHEN prop_name = 'FirstName' THEN prop_value END) AS FirstName, 
    MAX(CASE WHEN prop_name = 'LastName' THEN prop_value END) AS LastName, 
    MAX(CASE WHEN prop_name = 'Age'  THEN prop_value END) AS Age 
FROM 
    yourTable 
GROUP BY 
    user_id 

注:這是假設沒有USER_ID擁有任何prop_name的一個值,並沒有做任何造型不同的數據類型,但可以添加如果中必要。

或者,你可以查找如何在SQL中PIVOT。雖然我知道很多人被推遲了,並且更喜歡使用上面的CASE/Aggregate方法。在任一版本中,您都必須事先知道您希望得到哪些列作爲結果,但無法在沒有動態SQL的情況下對動態數量的列進行操作。


EDIT樞軸例如由於使用棄用NTEXT類型。

SELECT 
    pvt.user_id, [LastName], [FirstName], [Age] 
FROM 
    yourTable 
PIVOT 
    (prop_value FOR prop_name IN ([LastName], [FirstName], [Age])) AS pvt 
ORDER BY 
    pvt.user_id; 
+0

謝謝你的答案,但trere是一個問題:http://s017.radikal.ru/i431/1112/2a/a64fdf2e7a68.jpg MAX函數適用於數字數據類型,否則,我使用「ntext」類型的字段「 prop_value「 – user1095307 2011-12-17 14:29:14

+0

@ user1095307 - 你不應該再使用NTEXT了。它已被替換爲NVARCHAR(MAX),而不是(http://msdn.microsoft.com/en-us/library/ms187993.aspx)。 MAX()函數中允許使用哪個*(http://msdn.microsoft.com/zh-cn/library/ms187751.aspx)。如果您別無選擇,請查找Pivot,我將很快添加一個示例(http://msdn.microsoft.com/zh-cn/library/ms177410.aspx)。 – MatBailie 2011-12-17 14:35:34

+0

好的,非常感謝您的回答和鏈接!這對你的查詢很有幫助,這是我的錯誤( – user1095307 2011-12-17 14:52:46