2011-12-17 28 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