SQL查询中使用COALESCE:实现无成本记录默认值为0
解决方案
问题根源
你的原查询把product_costs.start_date < product_revenues.revenue_date放在了WHERE子句里,这会过滤掉LEFT JOIN后product_costs字段全为NULL的记录(比如收入ID1)——因为NULL和任何值比较都不成立,导致这些无对应成本的收入被排除在外。
修正后的SQL代码
SELECT pr.id AS revenue_id, pr.revenue_date, pr.amount AS revenue_amount, COALESCE(SUM(pc.amount), 0) AS totalCost FROM product_revenues pr LEFT JOIN product_costs pc ON pr.product_id = pc.product_id AND pc.start_date < pr.revenue_date GROUP BY pr.id, pr.revenue_date, pr.amount ORDER BY pr.id;
核心调整点
- 将成本日期的筛选条件移至LEFT JOIN的ON子句:这样LEFT JOIN会保留所有product_revenues的记录,无论是否存在符合条件的product_costs匹配项。
- 使用
COALESCE函数处理默认值:当某条收入没有对应的成本记录时,SUM(pc.amount)会返回NULL,COALESCE会自动将其替换为0,实现需求中的默认值设定。
预期结果
| revenue_id | revenue_date | revenue_amount | totalCost |
|---|---|---|---|
| 1 | 2023-01-01 | 100 | 0 |
| 2 | 2023-02-01 | 200 | 50 |
| 3 | 2023-03-01 | 300 | 150 |
内容的提问来源于stack exchange,提问作者Eden WebStudio
相关产品推荐
相关产品推荐

