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

MS SQL查询:基于最早发票日期统计TotalSavings金额

嘿,我来帮你搞定这个SQL问题~

问题分析

你想要实现的是:关联账户表和发票表,每个账户对应多张发票时,取该账户最早发票日期对应的TotalSavings总和(同一天有多笔就求和),同时要保留所有账户(包括没有发票的)。你的原查询没得到预期结果,主要是因为没有正确关联“最早日期”和对应的金额,也没做分组求和。

正确的SQL实现

这里给你两种常用的写法,适配大多数关系型数据库:

方式一:子查询 + 关联查询

SELECT 
    TA.AccountID,
    EarliestInv.InvoiceDate,
    -- 用COALESCE处理无发票的账户,返回0而不是NULL
    COALESCE(SUM(TI.TotalSavings), 0) AS TotalSavings
FROM tblAccount AS TA
-- 先通过子查询拿到每个账户的最早发票日期
LEFT JOIN (
    SELECT AccountID, MIN(InvoiceDate) AS InvoiceDate
    FROM tblInvoice
    GROUP BY AccountID
) AS EarliestInv ON TA.AccountID = EarliestInv.AccountID
-- 再关联回发票表,匹配账户ID和最早日期
LEFT JOIN tblInvoice AS TI 
    ON EarliestInv.AccountID = TI.AccountID 
    AND EarliestInv.InvoiceDate = TI.InvoiceDate
-- 按账户和最早日期分组,确保求和正确
GROUP BY TA.AccountID, EarliestInv.InvoiceDate
ORDER BY TA.AccountID;

方式二:CTE(公共表表达式)写法(更易读)

-- 先定义CTE,存储每个账户的最早发票日期
WITH EarliestInvoiceDates AS (
    SELECT AccountID, MIN(InvoiceDate) AS InvoiceDate
    FROM tblInvoice
    GROUP BY AccountID
)
SELECT 
    TA.AccountID,
    EID.InvoiceDate,
    COALESCE(SUM(TI.TotalSavings), 0) AS TotalSavings
FROM tblAccount AS TA
LEFT JOIN EarliestInvoiceDates AS EID ON TA.AccountID = EID.AccountID
LEFT JOIN tblInvoice AS TI 
    ON EID.AccountID = TI.AccountID 
    AND EID.InvoiceDate = TI.InvoiceDate
GROUP BY TA.AccountID, EID.InvoiceDate
ORDER BY TA.AccountID;
原查询的问题所在

你的原SQL没有对TA.AccountID和MIN(TI.InvoiceDate)进行分组,直接选取TI.TotalSavings时,数据库会返回该账户下某一条随机发票的金额,而不是你想要的“最早日期对应的金额总和”——这就是结果不符合预期的核心原因。

另外,COALESCE函数是可选的,如果你不需要把无发票账户的TotalSavings显示为0,可以去掉它,此时无发票的账户会返回NULL。

内容的提问来源于stack exchange,提问作者Sai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:45:10