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

PropertyDefaultName動的SQLを使用しない限り、列の値を列ヘッダーとして使用することはできません。動的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フィドルを参照してください

結果は次のとおりです。

| 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 に答える