PostgreSQL RIGHT JOIN结果过滤:移除不属于指定用户的分类
修正后的费用统计查询方案
问题分析
原查询使用RIGHT JOIN categories会返回所有分类,包括未分配给用户1的分类(如"Fancy food")。需要先限定仅处理用户1关联的分类,再关联费用数据进行统计。
修正后的查询语句
SELECT c.name AS name, COALESCE(COUNT(e.id), 0) AS count, COALESCE(ROUND(SUM(e.price)::numeric, 2), 0.00) AS sum FROM users_categories uc INNER JOIN categories c ON uc.category_id = c.id LEFT JOIN expenses e ON e.category_id = c.id AND e.user_id = 1 AND (EXTRACT(YEAR FROM e.date) = 2022 OR 2022 IS NULL) AND (EXTRACT(MONTH FROM e.date) = 8 OR 8 IS NULL) WHERE uc.user_id = 1 GROUP BY c.id, c.name ORDER BY c.id;
关键调整说明
- 限定用户分类范围:通过
users_categories与categories的内连接,只保留用户1拥有的分类,彻底排除无关分类。 - 左连接费用表:使用
LEFT JOIN确保即使分类下没有费用记录也会被保留,满足无费用分类显示0的需求。 - 条件前置过滤:将费用的用户ID和日期筛选放在JOIN条件中,避免WHERE子句过滤掉无费用的分类行。
- 空值处理:用
COALESCE将聚合后的null值转为0,统一统计结果格式。
内容的提问来源于stack exchange,提问作者Yurii
相关产品推荐
相关产品推荐

