You need to enable JavaScript to run this app. MySQL计算发票贷借差额后仅展示正余额未结清发票的查询方法
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 13:36:03