0

我从 sql 表中获取以下格式的数据:

DisplayName     PropertySystemName     PropertyDefaultName     PropertyValue
S1                  P1                    Property 1              Value 1
S1                  P2                    Property 2              Value 2
S1                  P3                    Property 3              Value 3
S1                  P4                    Property 4              Value 4
S1                  P5                    Property 5              Value 5
S1                  P6                    Property 6              Value 6
S1                  P7                    Property 7              Value 7
S1                  P8                    Property 8              Value 8
S1                  P9                    Property 9              Value 9
S1                  P10                   Property 10             Value 10

这是所需的输出:

DisplayName   Property 1   Property 2 Property 3
S1               Value 1     Value 2    Value 3

这是我的查询,但它不会产生所需的输出。

Select me.DisplayName,
     Min(Case PropertySystemName When 'P1' Then PropertyValue End) PropertyDefaultName,
     Min(Case PropertySystemName When 'P2' Then PropertyValue End) PropertyDefaultName,
     Min(Case PropertySystemName When 'P3' Then PropertyValue End) PropertyDefaultName
FROM vManagedEntity me

这是上述查询的输出:

DisplayName   PropertyDefaultName   PropertyDefaultName PropertyDefaultName
S1               Value 1                   Value 2           Value 3

我如何修改查询以生成所需的输出,而无需对列标题进行硬编码,因为它已经存在于表中。

4

1 回答 1

2

除非使用动态 sql,否则不能将列中的值PropertyDefaultName用作列标题。使用动态 SQL 将允许您直接从表中提取列值和标题名称:

DECLARE @cols AS NVARCHAR(MAX),
    @colNames AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(PropertySystemName) 
                    from vManagedEntity
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colNames = STUFF((SELECT ',' + QUOTENAME(PropertySystemName) 
                          + ' as '+ replace(PropertyDefaultName, ' ', '')
                    from vManagedEntity
                    group by PropertySystemName, PropertyDefaultName
                    order by cast(replace(PropertySystemName, 'P', '') as int)
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT DisplayName, ' + @colNames + ' from 
             (
                select DisplayName, PropertySystemName,
                   PropertyValue
                from vManagedEntity
            ) x
            pivot 
            (
                min(PropertyValue)
                for PropertySystemName in (' + @cols + ')
            ) p '

execute(@query)

请参阅带有演示的 SQL Fiddle

结果是:

| DISPLAYNAME | PROPERTY1 | PROPERTY2 | PROPERTY3 | PROPERTY4 | PROPERTY5 | PROPERTY6 | PROPERTY7 | PROPERTY8 | PROPERTY9 | PROPERTY10 |
----------------------------------------------------------------------------------------------------------------------------------------
|          S1 |   Value 1 |   Value 2 |   Value 3 |   Value 4 |   Value 5 |   Value 6 |   Value 7 |   Value 8 |   Value 9 |   Value 10 |
于 2012-11-27T19:06:31.760 回答