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

如何修改SQL语句筛选未支付或部分支付的Invoice?

解决方案

首先,你的原SQL需要两个关键调整:

  1. 处理支付金额为NULL的情况(当无对应支付记录时,sum(Paiements.amount)会返回NULL),用COALESCE函数将其转换为0,避免空值干扰判断;
  2. 使用HAVING子句过滤分组后的结果(WHERE无法直接使用聚合函数结果)。

修改后的SQL(基于你原有的表关联逻辑)

SELECT 
    SUM(budget.amount) AS m1, 
    COALESCE(SUM(Paiements.amount), 0) AS total_paid, 
    budget.code 
FROM 
    budget 
LEFT OUTER JOIN paiements 
    ON budget.code = Paiements.code 
GROUP BY 
    budget.code
HAVING 
    COALESCE(SUM(Paiements.amount), 0) = 0 
    OR SUM(budget.amount) != COALESCE(SUM(Paiements.amount), 0)

关键说明

  • COALESCE(SUM(Paiements.amount), 0):将无支付记录时的空值转为0,确保“未支付”的判断逻辑生效;
  • HAVING子句:专门筛选分组后的目标结果,覆盖两种场景:
    • 支付总金额为0(完全未支付);
    • 预算总金额与支付总金额不相等(部分支付)。

贴合核心需求的优化版本(关联中间表Invoice)

根据你描述的表关系(Invoice是Budget和Paiements的中间关联表),原SQL直接关联budget和paiements可能存在逻辑漏洞(比如同一预算下的多笔发票,支付记录实际对应发票而非预算)。如果要精准定位未支付/部分支付的Invoice,正确的关联逻辑应包含Invoice表:

SELECT 
    invoice.id AS invoice_id,
    SUM(budget.amount) AS invoice_total,
    COALESCE(SUM(paiements.amount), 0) AS total_paid
FROM 
    invoice
JOIN budget 
    ON invoice.budget_id = budget.id  -- 假设关联字段为budget_id
LEFT JOIN paiements 
    ON invoice.id = paiements.invoice_id  -- 假设关联字段为invoice_id
GROUP BY 
    invoice.id
HAVING 
    COALESCE(SUM(paiements.amount), 0) = 0 
    OR SUM(budget.amount) != COALESCE(SUM(paiements.amount), 0)

这个版本会直接返回每笔符合条件的Invoice记录,更匹配你“找出所有未支付或部分支付的Invoice”的核心需求。

内容的提问来源于stack exchange,提问作者Frédéric HORVAT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:24:13