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

多记录类型发票表未结余额计算SQL查询实现咨询

解决方案:用条件聚合直接计算未结余额

不用创建中间表的话,**条件聚合(CASE WHEN + 聚合函数)**是最简洁高效的方式,能在一次查询里完成所有金额的计算,完全满足你的需求。

针对单发票的查询语句

假设你的表名为invoice_records,针对发票号00820437的查询可以这么写:

SELECT
    Invoice_Num,
    -- 提取发票金额(Rec_Type=1),用MAX是因为单发票通常只有一条发票记录
    MAX(CASE WHEN Rec_Type = 1 THEN Dollar_Amt ELSE 0 END) AS Invoice_Amount,
    -- 累加所有付款金额(Rec_Type=7)
    SUM(CASE WHEN Rec_Type = 7 THEN Dollar_Amt ELSE 0 END) AS Total_Payments,
    -- 累加所有贷项凭证金额(Rec_Type=5)
    SUM(CASE WHEN Rec_Type = 5 THEN Dollar_Amt ELSE 0 END) AS Total_Credits,
    -- 按你的公式计算未结余额
    MAX(CASE WHEN Rec_Type = 1 THEN Dollar_Amt ELSE 0 END) - 
    (SUM(CASE WHEN Rec_Type = 7 THEN Dollar_Amt ELSE 0 END) - SUM(CASE WHEN Rec_Type = 5 THEN Dollar_Amt ELSE 0 END)) AS Outstanding_Balance
FROM invoice_records
WHERE Invoice_Num = '00820437'
GROUP BY Invoice_Num;

逻辑拆解

  1. 提取发票金额:用MAX(CASE...)是因为单发票只会有一条Rec_Type=1的记录(正常业务场景下),用MAX或者SUM都能拿到正确值,MAX更贴合“取唯一发票金额”的语义。
  2. 计算付款/贷项总金额:SUM(CASE...)会自动把对应类型的金额累加,非目标类型的金额按0处理,不会影响总和结果。
  3. 代入公式算余额:直接把前面计算的字段套进你给出的公式Outstanding_Balance = Invoice(1) - (Payment(7) - Credit(5)),一步得出结果。

示例数据验证

用你提供的数据测试:

  • 发票金额:536.77
  • 付款总金额:469.62 + 67.15 = 536.77
  • 无贷项凭证记录,所以Total_Credits=0

代入公式后结果为:536.77 - (536.77 - 0) = 0,完全符合“发票已全额付清”的业务逻辑。

扩展:批量计算所有发票余额

如果之后需要一次性计算所有发票的未结余额,只需要去掉WHERE Invoice_Num = '00820437'这个条件,查询会自动按每个发票号分组计算,不用做任何额外调整。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:44:25