多记录类型发票表未结余额计算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;
逻辑拆解
- 提取发票金额:用
MAX(CASE...)是因为单发票只会有一条Rec_Type=1的记录(正常业务场景下),用MAX或者SUM都能拿到正确值,MAX更贴合“取唯一发票金额”的语义。 - 计算付款/贷项总金额:
SUM(CASE...)会自动把对应类型的金额累加,非目标类型的金额按0处理,不会影响总和结果。 - 代入公式算余额:直接把前面计算的字段套进你给出的公式
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
相关产品推荐
相关产品推荐

