【发布时间】:2026-02-13 23:15:01
【问题描述】:
customers 表共有 1000 个客户,其中 1500 个在 2016 财年下订单。但我们希望显示所有客户及其在 2016 财年的订单总数,无论客户是否在该财年下订单。但 SQL Server 2012 中的以下查询仅显示 1490。
我们可能在这里遗漏了什么?
SELECT c.CustomerID, count(*) AS TotalOrders
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
WHERE o.FiscalYear = '2016'
GROUP BY c.CustomerID
更新:
以下查询仅返回 1 条记录 (1491) - 仍然缺少 9 条记录。
SELECT c.CustomerID, count(*) AS TotalOrders
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
AND o.FiscalYear = '2016'
GROUP BY c.CustomerID
【问题讨论】:
-
连接后应用 where 子句。因此,连接为没有订单的客户返回空值。但由于这些客户没有订单,会计年不等于 2016 年,因此记录被排除在外。更正将与外部连接相关的限制标准移动到连接标准,以便与连接一起施加限制。
-
您的总记录数应为 1000(客户),总和应为 1500。总和小于 1500 的唯一可能差异是您删除了客户和孤立的订单。或者您对 2016 年 1500 个订单的计数一开始就是错误的。
SELECT * from orders where customerID not in (Select customerID from customers) and FiscalYear = '2016'给你一些记录吗? -
是的,我会开始检查以下内容:对于所有记录,您的 FiscalYear 实际上是不同的“2016”吗?有可能出现错别字吗?记录如何标记为已删除(位/整数标志)?
-
select count(distinct customerid), count(*) from orders where fiscalyear = '2016'返回什么? -
如果没有键那么你有数字差异的原因是你有孤立的订单记录(客户记录已被删除,因此订单不能与客户绑定。你可以使用完整的外部加入而不是左键查看其中一些没有客户的记录。它应该让您的计数达到 1500。
标签: sql sql-server tsql sql-server-2012 outer-join