You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:53:15