SQL Sum函数统计发票数量出错,内连接子查询实现遇阻求助
子查询是可行的解决方案,以下是正确实现方式
首先,原代码返回错误数值的核心原因大概率是:SalesInvoice表中存在重复的SalesInvoiceId记录,导致内连接后SalesInvoiceLine的行被重复统计,最终SUM结果偏大。子查询可以先筛选并去重目标日期范围内的发票ID,再关联统计数量,从根源避免重复计算。
正确的子查询实现方式
方式一:内连接去重后的发票ID子查询
SELECT SUM(SIL.QuantityInvoice) AS QtyInv FROM dr.SalesInvoiceLine SIL INNER JOIN ( -- 筛选指定日期范围内的发票ID并去重 SELECT DISTINCT SI.SalesInvoiceId FROM dr.SalesInvoice SI WHERE SI.TransactionDate BETWEEN '2022-11-01' AND '2022-11-30' ) AS FilteredInvoices ON FilteredInvoices.SalesInvoiceId = SIL.SalesInvoiceId
方式二:使用WHERE EXISTS(性能更优)
如果只需要验证发票是否存在于目标日期范围内,用EXISTS替代连接更高效,避免不必要的行匹配:
SELECT SUM(SIL.QuantityInvoice) AS QtyInv FROM dr.SalesInvoiceLine SIL WHERE EXISTS ( SELECT 1 FROM dr.SalesInvoice SI WHERE SI.SalesInvoiceId = SIL.SalesInvoiceId AND SI.TransactionDate BETWEEN '2022-11-01' AND '2022-11-30' )
你尝试的子查询问题分析
你的代码存在几个关键错误:
- 子查询内部多余连接了
SalesInvoiceLine,完全没必要,筛选发票ID只需要从SalesInvoice表取即可; - 子查询没有设置别名,导致连接时语法错误;
- 日期范围写错成了12月,与需求的11月不符;
- 不需要按
SalesInvoiceId分组,因为你要的是总数量而非单张发票的数量。
内容的提问来源于stack exchange,提问作者jewfro
相关产品推荐
相关产品推荐

