MySQL计算发票贷借差额后仅展示正余额未结清发票的查询方法
问题原因拆解
你的原查询存在3处核心错误,导致无法得到预期结果:
- 子句执行顺序逻辑错位:SQL执行时会先处理
WHERE过滤、再执行聚合计算、最后才解析SELECT里定义的字段别名,你在WHERE中引用后续才会生成的Bal字段本身就不成立;同时你给bal加了单引号,把字段名变成了固定字符串常量,判断'bal' = 0永远为假,完全起不到过滤作用 - 过滤条件方向写反:需求是保留余额大于0的未结算发票,原语句写的是筛选余额等于0的已结算记录,逻辑方向完全偏差
- 聚合使用场景不匹配:如果
payable表每行对应单张发票的已汇总借贷值,强行使用SUM聚合会造成同发票数值重复累计,计算结果失真
正确查询方案
根据表的实际存储结构分两种场景:
场景1:每行存储单张发票的单次借贷记录(和你给出的示例数据结构一致)
无需聚合,直接计算差值后过滤即可:
SELECT `inv no.`, credit, debit, (credit - debit) AS Bal FROM payable WHERE (credit - debit) > 0
执行后输出的结果和你给出的示例完全匹配。
场景2:同一张发票存在多笔明细记录(同一个inv no.对应多行借贷流水)
需要先按发票号聚合计算汇总余额,再过滤符合要求的记录,此时聚合后的条件过滤必须用HAVING子句,不能用WHERE:
SELECT `inv no.`, SUM(credit) AS credit, SUM(debit) AS debit, SUM(credit - debit) AS Bal FROM payable GROUP BY `inv no.` HAVING Bal > 0
内容的提问来源于stack exchange,提问作者Henrik Kwok
相关产品推荐
相关产品推荐

