SQL Server:统计表A中的ID在表B中出现的次数

SQL Server:统计表A中的ID在表B中出现的次数,sql,sql-server,count,Sql,Sql Server,Count,我有两张桌子:产品和订单。订单通过ProductID作为外键引用产品。我想知道每个产品销售了多少次,包括只销售一次的产品。我几乎可以使用左联接使其工作,但这仍然会为所有产品提供一行计数为1的数据,无论它们是否存在于orders表中 有没有一种方法可以让你最终得到这样的结果 Product | Times sold Milk | 5 Bread | 18 Cheese | 0 。。。依此类推。如果你只做一个计数(*),那么你将没有订单的产品计数为1。。。相反,COUNT(o.Orde

我有两张桌子:产品和订单。订单通过ProductID作为外键引用产品。我想知道每个产品销售了多少次,包括只销售一次的产品。我几乎可以使用左联接使其工作,但这仍然会为所有产品提供一行计数为1的数据,无论它们是否存在于orders表中

有没有一种方法可以让你最终得到这样的结果

Product | Times sold
Milk    | 5
Bread   | 18
Cheese  | 0

。。。依此类推。

如果你只做一个
计数(*)
,那么你将没有订单的产品计数为1。。。相反,
COUNT(o.OrderID)
,它将只计算具有非空
OrderID
的记录

SELECT p.Product, COUNT(o.OrderID)
FROM
    Products p LEFT JOIN
    Orders o ON o.ProductID = p.ProductID
GROUP BY p.Product
差不多

Select Products.ProductName, Count(Orders.OrderID)
From Orders Inner join on Products Where Orders.ProductID = Products.ProductID
Group By Products.ProductName
@迈克尔是对的

如果您有一个带有计数的订单表,它将如下所示:

SELECT p.Product, SUM(ISNULL(o.ItemCount,0)) as [Count]
FROM
    Products p LEFT JOIN
    Orders o ON o.ProductID = p.ProductID
GROUP BY p.Product

如果您不希望返回没有订单的产品,则将您的
左连接
改为
内部连接
。左连接是正确的做法,特别是在您的示例中,如果您希望列出“cheese”,如果您不想要没有订单的行,它已经销售了零次,那么为什么您的示例输出显示“Cheese | 0”@ean5533-Op希望它显示
0
,而不是
1
。这就是
COUNT(id)
COUNT(*)
之间的区别我想这就是op目前正在做的事情我猜他在做一个
左连接
,所以它显示的
产品
没有
订单
,但他在做一个
COUNT(*)
,所以它显示的是1而不是0。啊!我一直目不转睛地盯着查询,没有意识到我使用的是COUNT(*)而不是COUNT(ProductID)