展平SQL行'属性'结果

时间:2011-06-17 17:46:54

标签: sql sql-server tsql

SQL Server 2005

我有以下结果集:

ID  name    prop    value
--------------------------
1   one     Prop1   va1_1_1
1   one     Prop2   val_1_2
2   two     Prop1   val_2_1
2   two     Prop2   val_2_2
3   three   Prop2   val_3_2
4   four    Prop1   val_4_1
4   four    Prop2   val_4_2

如何展平它以获得

的输出
ID  name    Prop1       Prop2
---------------------------------
1   one     val_1_1     val_1_2
2   two     val_2_1     val_2_2
3   three   val_3_2     NULL
4   four    val_4_1     val_4_2

注意:属性数量(Prop1Prop2)是任意的,可以很多。

3 个答案:

答案 0 :(得分:3)

请参阅MSDN: Using PIVOT and UNPIVOT

它有一个非常好的例子,说明你要做的事情。

这将为您提供所需的结果。

Select  *
From    (
        Select  ID,name,prop,value 
        from    YourTable 
        ) P
PIVOT ( max(value) For Prop in (Prop1,Prop2) ) as pvt
Order By ID 

请注意,您需要支持任意数量的道具值。在这种情况下,一种解决方案可以是动态构建此脚本并执行它。

修改 为了使其完整,这里的SQL适用于任意数量的prop值 -

Declare @Value as NVarChar(Max)
Set @Value =    'Select *
                From    (
                        Select  ID,name,prop,value 
                        from    YourTable 
                        ) P
                PIVOT ( max(value) For Prop in ('

Select @Value = @Value +  Prop + ','
from (  Select  Distinct Prop
        From YourTable) YT

Set @Value = Left(@Value, Len(@Value)-1)

Set @Value = @Value + ') ) as pvt Order By ID'
Exec(@Value)

答案 1 :(得分:0)

    SELECT ID,Name, (SELECT prop FROM table t1 WHERE prop=prop1 AND ID = table.id) AS Prop1,
    (SELECT prop FROM table t2 WHERE prop=prop2 AND ID = table.id) AS Prop2
    FROM table

答案 2 :(得分:0)