PostgreSQL查询无account_move_line匹配数据时如何将actual设为0
问题分析
原查询存在3个核心问题:
- 使用隐式内连接关联子查询
dd,当account_move_line在指定日期范围无对应数据时,匹配不到的行会直接被过滤,不会出现在结果中 - 未对聚合后的空值做处理,无匹配数据时
sum结果为null,无法直接参与运算 - 原语句
dd.analytic_account_id = .id属于笔误,需修正为dd.analytic_account_id = a.id,且结果需要展示的id字段未在查询列中声明
修正后的PostgreSQL查询语句
SELECT a.id, a.name, e.planned_amount, COALESCE(dd.sum_amount, 0) AS actual, e.planned_amount - COALESCE(dd.sum_amount, 0) AS avail FROM crossovered_budget_lines AS e INNER JOIN account_analytic_account AS a ON e.analytic_account_id = a.id LEFT JOIN ( SELECT analytic_account_id, SUM(debit + credit) AS sum_amount FROM account_move_line WHERE date BETWEEN '2021-01-01' AND '2021-05-01' GROUP BY analytic_account_id ) AS dd ON dd.analytic_account_id = a.id LIMIT 5;
关键修改说明
- 将原来的隐式内连接改为
LEFT JOIN关联子查询dd,就算子查询没有匹配数据,左表的行也会完整保留,不会被过滤 - 使用
COALESCE函数处理空值,当dd.sum_amount为null(即无匹配的流水数据)时自动赋值为0,保证后续avail字段的运算逻辑正常 - 改用显式JOIN写法,关联逻辑更清晰,避免隐式连接易出现的条件遗漏问题
- 补充查询
a.id字段,和要求的输出结构对齐
内容的提问来源于stack exchange,提问作者Marka
相关产品推荐
相关产品推荐

