2009-07-08 9 views
0

Ich habe eine Tabelle von Lieferanten und Tabellen Computer, Kameras, Displays alle mit dem Feld SupplierID.Wie verwende ich T-SQL Group By mit mehreren Tabellen?

Ich versuche, eine T-SQL zu tun, die alle Lieferanten auflisten wird, mit einer Zählung aller Zeilen. Ich kann mit ihnen einer nach dem anderen tun:

SELECT SupplierID, COUNT(dbo.Computers.ComputerID) as Computers 
FROM Supplier INNER JOIN 
    Computers ON Supplier.SupplierID = Computers.SupplierID 
GROUP BY SupplierID 

Wie kann ich das ändern die anderen Tabellen enthalten - wie Kameras, Displays usw. ...

+0

3 beantwortet die gleiche - so mache ich etwas dumm, aber ich bin die gleiche Zählung in beiden Feldern immer zB: s.SupplierID SELECT, COUNT (c.DataAccountID) als Computer, \t COUNT (d.LocalAccountID) als Anzeigen VON INNER JOIN s Lieferant Computer c ON s.SupplierID = c.SupplierID INNER JOIN \t Displays d ON s.SupplierID = d.SupplierID GROUP BY s.SupplierID Sie sollten ganz andere Zählungen haben - Da die Anzahl der Zeilen für die Lieferanten-ID 1 in der Computertabelle anders ist als die Anzeigen-Tabelle - aber wenn ich dies ausführe, bekomme ich passende Computer- und Display-Zählungen – aSkywalker

+0

danke für die tollen Antworten - meine Frage war wahrscheinlich nicht spezifisch genug - aber die linke äußere Verbindung und distinct war offensichtlich der Schlüsselteil, den ich vermisste ... – aSkywalker

Antwort

4

Unter der Annahme, dass ein Lieferant nicht jeden Produkttyp liefert, sollten Sie Outer Joins verwenden. Wenn Sie innere Verbindungen verwenden, erhalten Sie nur Lieferanten zurück, die mindestens eine von jeder Produktion liefern. Sie möchten auch die eindeutige ProductId für jeden Produkttyp zählen. Andernfalls erhalten Sie eine Multiplikation Wirkung. (Zum Beispiel Lieferant 1 liefert Computer 1 & 2 und Displays 10 & 11, Sie wieder vier Reihen von Computer erhalten wird 1 Display 10, Computer-1 Display 11, Computer 4 und Anzeige 11.)

Aufbauend auf gbn Antwort:

SELECT 
    Supplier.SupplierID, 
    COUNT(distinct Computers.ComputerID) as Computers, 
    COUNT(distinct Displays.DisplayID) as Displays, 
    COUNT(distinct Foos.FooID) as Foos, 
    COUNT(distinct Bars.BarID) as Bars 
FROM Supplier 
LEFT OUTER JOIN Computers 
    ON Supplier.SupplierID = Computers.SupplierID 
LEFT OUTER JOIN Displays 
    ON Supplier.SupplierID = Displays.SupplierID 
LEFT OUTER JOIN Foos 
    ON Supplier.SupplierID = Foos.SupplierID 
LEFT OUTER JOIN Bars 
    ON Supplier.SupplierID = Bars.SupplierID 
GROUP BY 
    Supplier.SupplierID 
+0

Danke - das war's! es funktioniert jetzt großartig! – aSkywalker

0

SELECT 
    SupplierID, COUNT(dbo.Computers.ComputerID), COUNT(dbo.Cameras.SupplierID) as Computers 
FROM Supplier 
INNER JOIN Computers ON Supplier.SupplierID = Computers.SupplierID 
INNER JOIN Cameras ON Supplier.SupplierID = Cameras.SupplierID 
GROUP BY SupplierID 
1

Da Sie mehrere SupplierID Spalten haben, Ich bin überrascht, dass Ihre ursprüngliche Abfrage funktioniert ... Die DB-Engine weiß nicht, SupplierID von der Supplier oder Computer Tabelle zu verwenden ...

Edit: korrigiert für OUTER JOINs!

4

Ich möchte nicht mit anderen gepostet wiederholen, aber ich stimme zu, dass Sie alle Tabellen beitreten und die Zählungen tun.

die Sache, die Sie beachten müssen (und dies ist eine individuelle Schema-Betrachtung) ist, dass Sie müssenleft join die Tabellen. Wenn Sie innerlich beitreten, können Sie Zeilen verlieren, wenn Sie NULL s in anderen Feldern haben. Diese Felder wären optionale Felder für die Tabelle.