2016-06-15 31 views
0

SQL結果の列の行を変換する問題があります。集計なしのSQLピボット

私の構造は次のとおりです。

GUID |プロパティ名| PropertyValue

abcd | | cn = abcd ...

abcd | CN | cn = GROUP_

abcd |オペレーション| ADD

1231 | | cn = 123dd

1231 | Cn | cn = ASDGRUOP

1231 |オペレーション| Del

私が以前知っていたn個のPropertyNamesは、動的に存在することがあります。問題なくSQLを使用して取得できます。

私はこのような構造をしたい: GUID | | CN |操作

abcd | cn = abcd ... | cn = GROUP_ | ADD

1231 | cn = 123dd | cn = ADSGROUP | DEL

など。

select @cols = STUFF ((SELECT DISTINCT '],[' + x.ParameterName from ... and parametername in ('PropertyValue','DistinguishedName', 'Operation') 
FOR XML PATH ('')),1,2,'') + ']' 

私はPIVOT-機能でこれを行うことができますが、私は集約を持っていけないので、私は正しい結果を得るカント:

set @query = N'SELECT '+ @cols + ' FROM (
    SELECT x.parametervalue, x.parametername 
    from ... and parametername in (''PropertyValue'',''DistinguishedName'', ''Operation'') 
    ) a 
    PIVOT (max(a.parametervalue) FOR ParameterName in (' + @cols + ')) as pv;' 
exec sp_executesql @query; 

を私は、このSQLによって取得

コラム、ヘッダ次の結果が得られます。

GUID | | CN |オペレーション| ...その他のプロパティ

abcd | cn = abcd ... | cn = GROUP_ | ADD | ...

1つの結果 - それ以上はありません。しかし、MAX()関数のためにこのクエリから700の結果があります。私は1つだけを取得します。すべての結果を得るために集計なしでピボットを取得するにはどうすればよいですか?

ありがとうございました!ここ

+0

*完全な例がないと手伝いが難しいです。あなたは近くにいる。 'PIVOT'演算は常に1つの行を生成するので、あなたがピボットする* resultset *に' GUID'カラムと 'parameter'カラムのそれぞれが含まれていることを確認する必要があります。 * PIVOTの一部ではない結果セット内の列の値。 –

答えて

1

動的PIVOTクエリである:

DECLARE @sql NVARCHAR(MAX), 
     @cols NVARCHAR(MAX); 

SELECT @cols = 
    STUFF((
     SELECT DISTINCT ',' + QUOTENAME(PropertyName) 
     FROM #tbl 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    , 1, 1, '') 

SELECT @sql = 
'SELECT GUID, ' + @cols + ' 
FROM (
    SELECT 
     GUID, PropertyName, PropertyValue 
    FROM #tbl 
) t 
PIVOT 
(
    MAX(PropertyValue) 
    FOR PropertyName IN(' + @cols + ') 
) p '; 

PRINT (@sql); 
EXEC (@sql); 

ONLINE DEMO


所望の結果を達成する別の方法は、dynamic crosstabを使用することである。

DECLARE @sql NVARCHAR(MAX); 

SELECT @sql = 
'SELECT 
    GUID' + CHAR(10) + 
(SELECT DISTINCT 
' , MAX(CASE WHEN PropertyName = ''' + PropertyName + ''' THEN PropertyValue END) AS ' + QUOTENAME(PropertyName) + CHAR(10) 
FROM #tbl 
FOR XML PATH('') 
) + 
'FROM #tbl 
GROUP BY GUID;'; 

PRINT (@sql); 
EXEC (@sql); 

ONLINE DEMO

+1

ist Working!迅速で華麗な答えをありがとう! – Phil

+0

唯一の問題は、このSQLをレポートエディタ内で実行する必要があり、このプログラムはEXECUTE SP_EXECUTESQLコマンドを認識しないことです。このコマンドを実行しないでクエリを変換するにはどうすればよいですか? – Phil