SQL转换表结构

时间:2011-12-17 14:09:02

标签: sql ssis

我在SSIS中创建DTS - 数据包:

table 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  

是否可以在没有JOIN(性能!!!)的情况下执行此操作,例如,通过case语句或Visual Studio中的组件?请告知如何做到这一点。

1 个答案:

答案 0 :(得分: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,则无法对动态数量的列进行操作。


编辑由于使用了已弃用的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;