2017-03-11 4 views
1

Ich bin ein SQL-Noob und so könnte dies für Sie alle ziemlich einfach sein, aber ich habe Mühe, hier einige Logik anzuwenden. Ich versuche, eine Liste aller Städte und Staaten aus 2 Tabellen (Lieferanten vs Verbraucher Tabellen) zu erstellen, verknüpft durch eine 3. transact Tabelle, und liste die Anzahl der Lieferanten und Verbraucher in jeder Stadt (gruppiert nach). Zu beachten ist, dass die Anzahl der Städte und des Bundeslandes in den 2 Tabellen nicht übereinstimmt. Für diejenigen, die übereinstimmen, brauche ich eine Ausgabe, die die entsprechende Anzahl von Lieferanten und Konsumenten zeigt, wenn der Staat/die Stadt in einer Tabelle vorhanden ist und nicht die andere, muss ich eine Anzahl von null anzeigen, die unter der entsprechenden Zahlspalte angezeigt wird. Ich habe 3 Tabellen - Supplier, Consumer und Transaction verknüpft durch Supp_ID und Con_ID als Schlüssel, wie in meinem Code unten erwähnt.sql join issue - keine erwartete Ausgabe

Wenn ich diese Abfrage eingib, bekomme ich seltsame Zahlen gegen die Anzahl der Lieferanten und Verbraucher. Meine beste Vermutung ist, dass dort irgendwo ein Selbstmitglied sein muss, aber ich bin nicht sicher, wie ich das von hier aus machen soll. Jede Hilfe wäre willkommen! Thank u

PS:

SELECT DISTINCT City, State, COUNT(Supp_ID) 
FROM SuppTb S GROUP BY City, State 

und

SELECT DISTINCT City, State, COUNT(Con_ID) 
FROM ConTb C GROUP BY City, State 

gibt mir die Ausgabe-I getrennt von beiden Tabellen müssen. Ausgang 1 hat 3 Spalten und 7 Zeilen, Ausgang 2 hat 3 Spalten und 6 Zeilen. Ich brauche eine einzige kombinierte Ausgabe mit 4 Spalten und 8 Zeilen. Sie müssen nur einen Weg finden, diese 2 Ausgänge zu kombinieren und Nullen einzufügen, wo immer es nötig ist.

Edit- Die genaue Frage ist, eine vergleichende Liste der Lieferanten oder Verbraucherstaaten und Städte mit der jeweiligen Anzahl von Lieferanten und Verbrauchern in jeder Stadt zu generieren. Wunsch Output-

State  City  Supp_count  Cons_count 
Illinois Chicago  2     3 
Illinois Springfield 2     0 
Michigan Lansing  0     3 

etc das heißt, 0 für die Ausgabe, wenn supp/Nachteile Tabelle nicht die Stadt/Land aufgelistet hat.

Bearbeiten 2- Dieser Code wurde versucht, gab mir die gewünschte Anzahl an Kunden, aber gibt seltsame Zahlen auf Lieferanten zählen. Ich stecke jetzt total fest! die Ideen ausgehen ..

SELECT C.State, C.City, COUNT(DISTINCT S.Supp_ID) AS Supp_Count,  COUNT(DISTINCT C.Con_ID) AS Cust_Count 
FROM Tb_Supplier S LEFT JOIN Tb_Transactions T 
ON S.Supp_ID = T.Supp_ID LEFT JOIN 
    Tb_Consumer C ON T.Con_ID = C.Con_ID 
    GROUP BY C.State, C.City 
EXCEPT 
SELECT S.State, S.City, COUNT(DISTINCT S.Supp_ID) AS Supp_Count, COUNT(DISTINCT C.Con_ID) AS Cust_Count 
FROM Tb_Supplier S LEFT JOIN Tb_Transactions T 
ON S.Supp_ID = T.Supp_ID LEFT JOIN 
    Tb_Consumer C ON T.Con_ID = C.Con_ID 
GROUP BY S.State, S.City 

Antwort

1

Zuerst nie Kommas in der FROM Klausel. Immer verwenden Sie explizite, ordnungsgemäße JOIN Syntax.

Ihr Problem besteht darin, dass Sie zwei nicht miteinander verknüpfte Dimensionen verknüpfen, sodass Ihre Abfrage ein kartesisches Produkt für jede state/city Kombination erzeugt. Die einfachste Lösung ist COUNT(DISTINCT) zu verwenden:

SELECT S.State, S.City, 
     COUNT(DISTINCT S.Supp_ID) AS Supp_Count, 
     COUNT(DISTINCT C.Con_ID) AS Cust_Count 
FROM SuppTb S JOIN 
    TransTb T 
    ON S.Supp_ID = T.Supp_ID JOIN 
    ConsTb C 
    ON T.Con_ID = C.Con_ID 
GROUP BY S.State, S.City; 

Dies funktioniert gut, wenn es entlang jeder Dimension nicht zu viele Duplikate sind. Die "richtige" Lösung ist die Aggregation vor die Joins zu tun.

+0

Vielen Dank für Ihre Zeit, stimmen Sie zu, dass JOIN in Syntax gute Klarheit gibt. Aber die Abfrage lieferte immer noch nicht die gewünschte Ausgabe. Ich habe einige Änderungen vorgenommen, um genau das zu integrieren, was ich brauche, und habe die letzte Spur mit LINKER VERBINDUNG eingeschlossen. Ich habe die richtige Anzahl an Kundenzählern, aber immer noch große Zahlen für die Lieferantenanzahl wie ich, als ich Ihre Anfrage lief) – Cur123

+0

@ Cur123. . . Verwenden Sie 'COUNT (DISTINCT)'? –

+0

Ja, ich habe Mr.Linoff. Ich bekam die Antwort mit UNION und zuerst eine temporäre Tabelle erstellen und dann die temporäre Tabelle mit den Lieferanten- und Consumer-Tabellen über FULL OUTER JOINS verknüpfen, um das genaue Ergebnis zu erhalten, das ich wollte. Nahm eine sehr lange Zeit, aber war sehr befriedigend, um es endlich zu bekommen! Ich habe meine Antwort selbst geposted, sobald ich es bekommen habe .. Entschuldigung, wenn ich es nicht klar gemacht hätte .. Nochmals vielen Dank für Ihre Unterstützung! – Cur123

0

Update- Ich habe die Antwort selbst !! Ich erstellte zuerst eine neue Tabelle, um alle DISTINCT Staaten und Städte aufzulisten, die ich interessierte (UNION anstelle , um die Dups zu verwenden, die ich früher erhielt), benutzte dann FULL JOIN s, um die Lieferanten- und Verbrauchertabellen zu verbinden und zu kombinieren neue Tabelle.

Ahhh!Die Freude, eine Frage selbst zu stellen, wenn Sie völlig neu in der Programmiersprache sind, ist einfach unvergleichbar !! Vielen Dank!