我有一个供应商表,并且表格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
如何更改此项以包含其他表格 - 如相机,显示器等......
答案 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