如何在多个表中使用T-SQL Group By?

时间:2009-07-08 19:20:03

标签: sql sql-server tsql

我有一个供应商表,并且表格Computers,Cameras,Displays都包含SupplierID字段。

我正在尝试使用T-SQL列出所有供应商,并列出所有行数。我可以一次做一个:

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

如何更改此项以包含其他表格 - 如相机,显示器等......

4 个答案:

答案 0 :(得分:4)

我不想重复与其他人发布的内容,但我同意你加入所有表并进行计数。

您需要考虑的事情(这是个人架构考虑因素)是您需要 left join表格。 如果你内心加入它们,如果你在其他字段中有NULL,则可能会丢失行。这些字段是表格的可选字段。

答案 1 :(得分:4)

假设供应商可能不提供每种类型的产品,您将需要使用外部联接。 如果您使用内部联接,您将只返回至少提供每个生产中的一个的供应商。 您还需要为每种产品类型计算不同的ProductId。否则你会得到一个 多重影响。 (例如,供应商1提供计算机1和2以及显示器10和11, 你会得到四排计算机1显示器10,计算机1显示器11,计算机4和显示器11.)

以gbn的答案为基础:

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

答案 2 :(得分:1)

因为您有多个SupplierID列,所以我对您的原始查询工作感到惊讶... 数据库引擎不知道从供应商或计算机表中使用SupplierID ...

编辑:更正了OUTER JOIN!

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

答案 3 :(得分: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