2016-08-18 1 views
0

Das ursprüngliche Problem, das ich zu lösen versuche, ist, dass ich alle Zeilen aus einer bestimmten "verbundenen" Tabelle zeigen muss. Diese sind jedoch manchmal leer ohne Summen und würden normalerweise nicht angezeigt (denke Kategorien und zählt für jeden).Union, die Werte aus der ersten Tabelle ausschließt

Also was ich versuche zu tun ist Union mit einem "0-Wert" -Datensatz, um alle Kategorien anzuzeigen. Aber wenn ich die Union mache, zeigt es eine 0-Wert-Zeile, sowie die normalen Daten. Hier ist ein Beispiel ..

SELECT category_name, COUNT(files_number) 
FROM files 
LEFT JOIN categories ON categories.category_id = files.category_id 

UNION 

SELECT category_name, 0 
FROM categories 

Das gibt mir eine Ergebnismenge, die in etwa so aussieht:

category_name | value 
---------------------- 
open file  | 0 
open file  | 23 
closed file | 0 

Gibt es einen Weg, um doppelte Nullwert Einträge entfernen? Bitte beachten Sie, dass es in der tatsächlichen Abfrage auch eine komplexe WHERE-Klausel gibt, so dass die Vermeidung von Doppelungen bevorzugt wird.

+0

Ich habe dies in der ursprünglichen Frage vergessen - aber es gibt einige Einschränkungen, denen ich gegenüberstehe, weil dies mit BIRT implementiert wird. Daher kann die "richtige" Antwort für mich die von BIRT auferlegten Einschränkungen widerspiegeln. – Sh4d0wsPlyr

Antwort

1

ich nicht, warum Sie beitreten und Vereinigung links tun ..

Sie können unten tun Duplikate zu entfernen, wickeln Sie Ihre Anfrage und tun Gruppe von

;with cte 
as 
(
SELECT category_name, COUNT(files_number) 
FROM files 
LEFT JOIN categories ON categories.category_id = files.category_id 
UNION 
SELECT category_name, 0 
FROM categories 
) 
select categoryname,sum(aggcol) 
from cte 
group by 
category 
+0

Ich musste eine kleine Änderung daran vornehmen (weil mein Tool - BIRT - mich nicht alles in SQL-Server machen lässt. Es scheint jedoch zu funktionieren und erspart mir, dass ich irgendeine der Abfragen ändern muss. Ein wenig darüber nachdenken mehr, aber das funktioniert (mehr oder weniger) – Sh4d0wsPlyr

1

Eine Möglichkeit, zu wählen ist alle Kategorien aus der Tabelle categories und LEFT JOIN auf die Anzahl der Dateien (gruppiert nach category_id).

SELECT c.category_name, ISNULL(fc.FileCount, 0) AS FileCount 
FROM categories c 
    LEFT JOIN (
     SELECT category_id, COUNT(files_number) AS FileCount 
     FROM files 
     GROUP BY category_id 
    ) fc ON c.category_id = fc.category_id 

bearbeiten Wenn Sie die Abfrage rückgängig machen möchten, können Sie es so etwas tun könnte, eine RIGHT OUTER mit JOIN - so jede Kategorie von Kategorien Tabelle zurückgegeben wird, unabhängig davon, ob es irgendwelche Dateien sind für es:

SELECT c.category_name, COUNT(f.category_id) AS FileCount 
FROM files f 
    RIGHT JOIN categories c ON c.category_id = f.category_id 
GROUP BY c.name 
+0

Ich bin mir nicht sicher, ob es für Ihr Beispiel wichtig ist - aber die Abfrage (die ich lieber nicht neu schreiben müsste, da sie groß und komplex ist) ist umgekehrt - ZB Dateien auswählen , beitreten Kategorien Ich habe auch mehrere sum/avg/count läuft auf dieser Frage.Sie denken, es wird immer noch mit der vorgeschlagenen Lösung arbeiten? – Sh4d0wsPlyr

Verwandte Themen