2012-04-12 12 views
1
SELECT 
    CH.ChannelName, COUNT(O.OrderID) AS Orders 
FROM 
    Channels CH 
LEFT JOIN Programs P USING (ChannelID) 
LEFT JOIN Codes C USING (ProgramID) 
LEFT JOIN Order O USING (CodeID) 
WHERE 
    O.OrderDate = '2012-04-11' 
GROUP BY 
    CH.ChannelName 
WITH ROLLUP 

Diese Abfrage gibt nur Kanäle mit Bestellungen zurück. Wie zeige ich ALLE Kanäle an, auch wenn in der Auftragstabelle für diesen bestimmten Kanal keine Aufträge vorhanden sind? Im Grunde werden alle Kanäle aufgelistet, und wenn es keine Befehle für diesen Kanal gibt, muss ich Null anzeigen.Linke Verbindung Alle Zeilen anzeigen

Ich weiß, dass die Lösung hierfür wahrscheinlich sehr einfach ist. Danke für die Hilfe.

Antwort

0

Ihre where-Klausel schränkt die Abfrage auf die Kanäle, die Aufträge für das Datum haben, aber wenn man diese Bedingung in der Erklärung beitreten bewegen wird es geben Sie das gewünschte Ergebnis:

SELECT 
    CH.ChannelName, COUNT(O.ID) AS Orders 
FROM 
    Channels CH 
LEFT JOIN Programs P USING (ChannelID) 
LEFT JOIN Codes C USING (ProgramID) 
LEFT JOIN Order O ON CH.CodeID = O.CodeID AND O.OrderDate = '2012-04-11' 
GROUP BY 
    CH.ChannelName 
WITH ROLLUP 

Hinweis, dass Es sollte COUNT(O.ID) sein, damit SQL nur Zeilen mit Nicht-Null-Ordnungen zählt. In diesem Fall erhalten Sie korrekt null Bestellungen für Kanäle ohne Bestellungen.

0
SELECT 
    CH.ChannelName, COUNT(O.OrderID) AS Orders 
FROM 
    Channels CH 
LEFT JOIN Programs P USING (ChannelID) 
LEFT JOIN Codes C USING (ProgramID) 
LEFT OUTER JOIN Order O USING (CodeID) 
WHERE 
    O.OrderDate = '2012-04-11' 
GROUP BY 
    CH.ChannelName 
WITH ROLLUP 
+0

äußere Verbindung wird in diesem Fall nicht helfen. Es fügt nur Zeilen für Aufträge hinzu, die keinen entsprechenden Kanal haben, aber das ist nicht das, was OP will. –

0

Versuchen Sie folgendes:

SELECT CH.ChannelName, SUM(O.OrderDate = '2012-04-11') AS Orders 
FROM Channels CH 
LEFT JOIN Programs P USING (ChannelID) 
LEFT JOIN Codes C USING (ProgramID) 
LEFT JOIN Order O USING (CodeID) 
GROUP BY CH.ChannelName 
WITH ROLLUP 
+1

Angenommen, Sie haben einen Kanal mit nur einer Bestellung an einem anderen Datum, sagen wir am 2012-12-12. Nach dem Beitritt wird es nur eine Zeile für diesen Kanal geben und 2012-12-12 in der Spalte 'OrderDate'. Dann wird Ihre Where-Klausel diese Zeile filtern und die resultierende Tabelle wird diesen Kanal überhaupt nicht enthalten. Habe ich recht? –

+0

@ KL-7 Sie haben absolut Recht. Ich habe meine Antwort bearbeitet. –

+0

Schön, das sollte funktionieren. Aber wenn Sie an Leistung denken, würde ich erwarten, diese Bedingung in die Join-Anweisung zu verschieben. Machen Sie es ein bisschen schneller, da wir nach dem Verbinden der Tabellen eine kleinere Anzahl von Zeilen erhalten. –

Verwandte Themen