2016-02-11 4 views
5

Ich versuche eine Pivot-Tabelle zu erstellen, die nur Strings enthält.Wie NULL-Werte in Pivot-Tabelle ersetzen?

Dies ist eine einfache Version meiner Tabelle:

CREATE TABLE SecurityGroup (GroupName VARCHAR(20), SecLevel VARCHAR(20),  Power VARCHAR(20)) 
INSERT INTO SecurityGroup 
SELECT 'GroupA','Level1','read' 
UNION 
SELECT 'GroupA','Level2','write' 
UNION 
SELECT 'GroupA','Level3','read' 
UNION 
SELECT 'GroupA','Level4','read' 
UNION 
SELECT 'GroupA','Level4','write' 

Ich möchte die Pivot-Funktion verwenden, um die folgenden Resultset

GroupName Level1 Level2 Level3 Level4 
GroupA  read  write  read  read 
GroupA  read  write  read  write 

Das Problem ich habe

Erwartung zu erhalten ist, dass die Werte für Level1 - Level3 nur einmal existieren, während Level4 2 verschiedene Werte hat. So bin ich immer erhalte diese Resultset:

Reality

GroupName Level1 Level2 Level3 Level4 
GroupA  read  write  read  read 
GroupA  NULL  NULL  NULL  write 

Ich verwende diesen Code

SELECT 
[GroupName], 
[Level1], 
[Level2], 
[Level3], 
[Level4] 
FROM 
(SELECT 
[GroupName], 
[SecLevel], 
[Power], 
ROW_NUMBER() OVER(PARTITION BY [GroupName], [SecLevel] ORDER BY [Power]) AS rn 
FROM [SecurityGroup]) AS SourceTable 
PIVOT 
(MAX([Power]) 
    FOR [SecLevel] 
    IN ([Level1], [Level2], [Level3], [Level4]) 
) AS PivotTable 

Irgendwelche Ideen, wie man das Problem lösen? Ich kann keine weiteren Werte für Level1 - Level3 in der Quelltabelle hinzufügen.

Ich habe bereits versucht, RANK() anstelle von ROW_NUMBER() zu verwenden, aber es hat nicht funktioniert.

Danke für Ihre Hilfe.

+0

Ein Schmerz zu schreiben, aber meine Idee ist, eine CTE oder temporäre Tabelle zu verwenden, in der Sie Werte für Level1 - Level3 hinzufügen, und wählen Sie dann aus dem CTE anstelle der Tabelle. Die tatsächliche Tabelle muss nicht geändert werden. Es sollte etwas eleganteres geben, aber ich komme nicht dazu. –

+0

Wenn Sie das Eingabeergebnis betrachten, gibt Ihr PIVOT das korrekte Ergebnis zurück! Sie haben im Wesentlichen zwei verschiedene Gruppen, obwohl sie beide GroupA heißen. Einer hat einen Wert für alle 4 Ebenen und einer hat nur für Stufe 4. –

+0

BTW, warum generieren Sie eine RowNumber und verwenden sie nirgendwo? –

Antwort

2
SELECT 
[GroupName], 
MAX([Level1]) OVER (PARTITION BY [GroupName]) [Level1], 
MAX([Level2]) OVER (PARTITION BY [GroupName]) [Level2], 
MAX([Level3]) OVER (PARTITION BY [GroupName]) [Level3], 
[Level4] 
FROM 
(SELECT 
[GroupName], 
[SecLevel], 
[Power], 
ROW_NUMBER() OVER(PARTITION BY [GroupName], [SecLevel] ORDER BY [Power]) AS rn 
FROM [SecurityGroup]) AS SourceTable 
PIVOT 
(MAX([Power]) 
    FOR [SecLevel] 
    IN ([Level1], [Level2], [Level3], [Level4]) 
) AS PivotTable; 
+0

Vielen Dank! Diese Version hat funktioniert. –