SQL Server:统计表A中的ID在表B中出现的次数
我有两张桌子:产品和订单。订单通过ProductID作为外键引用产品。我想知道每个产品销售了多少次,包括只销售一次的产品。我几乎可以使用左联接使其工作,但这仍然会为所有产品提供一行计数为1的数据,无论它们是否存在于orders表中 有没有一种方法可以让你最终得到这样的结果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
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)