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

SQL关联多表累加计算:对比项目预期收入与实际开票额

SQL实现方案

你这个场景核心要注意的坑是:单个项目对应多条开票记录,如果直接把两张表连起来再算,会把项目的预期金额重复乘上开票记录条数,结果完全错。所以正确逻辑是先把开票表按项目号分组,把每个项目的所有开票金额加总算出单项目实际总开票额,再和项目表关联计算差额。
直接用下面的代码就行:

SELECT
  p.name AS 项目名称,
  p.number AS 项目编号,
  p.customer_name AS 客户名称,
  p.expectedValue_amount AS 预期开票金额,
  IFNULL(i.actual_invoice_total, 0) AS 实际开票总额,
  p.expectedValue_amount - IFNULL(i.actual_invoice_total, 0) AS 预期实际差额
FROM
  Projects p
LEFT JOIN (
  -- 子查询先按项目聚合开票金额
  SELECT
    projects_number,
    SUM(totalExcludingTax_amount) AS actual_invoice_total
  FROM Invoices
  GROUP BY projects_number
) i ON p.number = i.projects_number

几个细节说明:

  • 用LEFT JOIN而不是内连接,是为了保留从来没开过票的项目,不会漏掉项目表的数据
  • 用IFNULL(i.actual_invoice_total, 0)是因为没开过票的项目匹配不到开票数据,聚合结果是空值,转成0之后计算差额不会出问题
  • 子查询里的SUM(totalExcludingTax_amount)配合GROUP BY projects_number,就是按项目维度累加所有开票记录的金额,刚好满足你按项目统计实际开票总额的需求
  • 字段别名可以根据你想要的表头文字自行修改,和你预期的输出列对齐就行

小提示:你之前写的Projects查询语句里,expectedValue_amount字段末尾多了个多余的逗号,直接运行会报语法错误,写的时候记得删掉最后一个查询字段后面的逗号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:18:26