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
相关产品推荐
相关产品推荐

