2016-06-15 19 views
0

Ich habe ein Problem beim Konvertieren von Zeilen in Spalten eines SQL-Ergebnisses.SQL Pivot ohne Aggregation

Meine Struktur ist wie folgt:

GUID | Eigenschaftsname | PropertyValue

abcd | DistinguishedName | cn = abcd ...

abcd | CN | cn = GROUP_

abcd | Bedienung | ADD

1231 | DistinguishedName | cn = 123dd

1231 | Cn | cn = ASDGRUOP

1231 | Bedienung | DEL

Es kann n PropertyNames geben, die ich vorher nicht kenne, sie sind dynamisch - ich kann sie durch ein SQL bekommen, das ist nicht das Problem.

Ich möchte eine Struktur wie diese haben: GUID | DistinguishedName | CN | Bedienung

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

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

und so weiter.

Die Column-Header i dieses SQL erhalten:

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

ich dies mit PIVOT-Funktion tun können, aber weil ich Aggregation nicht haben, kann ich nicht das richtige Ergebnis erhalten:

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; 

Ich erhalte folgendes Ergebnis:

GUID | DistinguishedName | CN | Bedienung | ... andere Immobilien

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

Nur 1 Ergebnis - nicht mehr. Aber es gibt wie 700 Ergebnisse von dieser Abfrage, wegen der Funktion MAX() bekomme ich nur eine. Wie kann ich ein Pivot ohne Aggregation erhalten, um alle Ergebnisse zu erhalten?

Vielen Dank im Voraus!Hier

+0

Es ist schwierig, ohne ein * vollständiges * Beispiel zu helfen. Du bist nah dran. Sie müssen nur sicherstellen, dass das * resultset *, das Sie drehen, die 'GUID'-Spalte sowie jede der' Parameter'-Spalten enthält, da eine 'PIVOT'-Operation immer eine Zeile * pro * bestimmter Menge von erzeugt Werte für die Spalten in der Ergebnismenge, die * nicht * Teil des 'PIVOT' sind. –

Antwort

1

ist die dynamische PIVOT Abfrage:

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


Ein anderer Weg, um das gewünschte Ergebnis zu erzielen, ist eine dynamic crosstab zu verwenden:

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

funktioniert! Vielen Dank für die schnelle und brillante Antwort! – Phil

+0

Das einzige Problem ist, ich muss diese SQL in einem Bericht-Editor ausführen und dieses Programm kennt nicht den Befehl EXECUTE SP_EXECUTESQL. Wie kann ich die Abfrage so transformieren, dass sie ohne diesen Befehl ausgeführt wird? – Phil