Eliminieren von NULLs bei der Verwendung von CASE in SQL server SELECT-statement

Ich habe einen großen, unordentlichen Bericht zu schreiben, dass verbindet sich über 5 Tabellen. Es gibt eine Spalte in einer Tabelle, die für mehrere verschiedene Werte verwendet wird – im Wesentlichen eine "Tag" -Spalte, wo die Tags in kreativer Weise verwendet werden, je nachdem, welche Art von verschiedenen Metadaten die Benutzer verwenden möchten.

Infolgedessen gibt meine Abfrage für den Bericht 3 nahezu identische Zeilen zurück, die sich nur in der Spalte "Tag" unterscheiden. zum Beispiel könnte ich bekommen:

NAME TAG EMAIL BOB A BOB@EXAMPLE.COM BOB B BOB@EXAMPLE.COM BOB C BOB@EXAMPLE.COM 

Was ich tun möchte, ist, den Inhalt der TAG-Spalte zu teilen, um als 3 separate Spalten aus der Abfrage zurückgegeben zu werden, wie folgt:

 NAME ABC EMAIL BOB ABC BOB@EXAMPLE.COM 

Also habe ich versucht, die SQL SERVER CASE / WHEN functionalität zu tun, um dies zu tun; Ich sage zum Beispiel, wenn der Wert der Tag-Spalte "A" ist, geben Sie ihn in Spalte "A" zurück; wenn es "B" ist, leg es in "B"; etc. Ich dachte, das würde das oben wiedergeben, aber stattdessen gibt es mir das:

 NAME ABC EMAIL BOB A NULL NULL BOB@EXAMPLE.COM BOB NULL B NULL BOB@EXAMPLE.COM BOB NULL NULL C BOB@EXAMPLE.COM 

Das ist deutlich weniger als ideal.

Irgendwelche Gedanken, Genies von Stack Overflow?

Versuche dies:

  Select Name, Min (Case When tag = 'A' Then Tag End) A, Min (Case When tag = 'B' Then Tag End) B, Min (Case When tag = 'C' Then Tag End) C, email From tableName Group By Name, email 

EDIT: zu erklären …
Jedes Mal, wenn Sie eine Group By , sagen Sie dem Abfrage-processor, dass Sie es wollen, um die Ergebnisse in "Buckets" zu aggregieren, wobei jeder Bucket durch eindeutige Werte in den Spalten [oder Ausdrücken] definiert ist, die in der Group By-Klausel definiert sind. Das bedeutet, dass die endgültige Ergebnismenge eine und nur eine Zeile für jeden einzelnen Satz von Werten in den Spalten [oder Ausdrücken] haben wird, die in der Gruppe By definiert sind. Alle anderen Spalten oder Ausdrücke, die in der Abfrage verwendet werden (anders als die in der Gruppe By), muss ein Ausdruck sein, der auf einer Aggregationsfunktion basiert (wie Count (), Summe (), Avg (), Min (), Max ( ), etc …), die einen Wert erzeugen, der auf einer Berechnung basiert, die auf alle Zeilen in der voraggregierten Ergebnismenge angewendet wird. Wenn ich zum Beispiel Group By dem ersten Charakter des Nachnamens zusammenkomme:

 Select Left(LastName, 1), Count(*), Sum(Salaray, Avg(Height), Min(DateOfBirth), etc. From Table Group By Left(LastName, 1) 

dann bekomme ich höchstens 26 Zeilen in der Ausgabe (eine für jeden Buchstaben im Alphabet) und alle anderen Spalten in meiner Ausgabe müssen auf einer Aggregationsfunktion basieren, die auf alle Zeilen im Originalsatz angewendet werden soll, wo der Nachname beginnt mit einem 'A', dann alle Zeilen, wo der Nachname beginnt mit qa 'B' etc ..

In deinem Problem wird die Gruppe By einfach verwendet, um die Ausgabe auf eine Zeile pro einzelnen Benutzer und E-Mail zu beschränken. Sobald dies geschehen ist, gibt es nur eine Zeile pro Die anderen Spalten in der Select-statement muss ein Min() , [ Max() würde genauso gut funktionieren), nur um die syntakische Anforderung in fett kursiv zu erfüllen oben .. In deinem Fall gibt es nur eine Nicht-Null-Zeile in der Menge, so dass die Min (), oder die Max () ist nur notwendig, weil der Syntax Anforderung …

Sie müssen die data pivot .

 ;with Report (name, tag, email) as ( select 'BOB', 'A', 'BOB@BOB.COM' union select 'BOB', 'B', 'BOB@BOB.COM' union select 'BOB', 'C', 'BOB@BOB.COM' ) select * from Report pivot ( min(tag) for tag in ([A], [B], [C])) as pvt 

Und das Ergebnis der Ausführung der obigen Abfrage ist das:

 NAME EMAIL ABC ----------------------------- BOB BOB@BOB.COM ABC