客户月度消费统计及总营收拆分SQL查询不匹配调整咨询
SQL客户月度消费统计调整方案
统计不匹配的核心原因
- 冗余关联booking表引发重复计算:1条job工单通常对应多条booking预约记录,关联后job数据会被重复展开,
sum(job.client_charge)会重复累加相同工单的金额,是数值偏高的最常见原因,且原逻辑未用到booking表的任何字段,可直接删除该关联。 - LEFT JOIN逻辑冲突:对user表使用LEFT JOIN后,WHERE子句添加了
user.date_joined的非空过滤条件,会直接过滤掉未关联到user的客户,LEFT JOIN实际等效于INNER JOIN,若确实需要保留无对应user的客户,需将日期过滤条件移到JOIN user ON ...的子句中。 - 日期格式存在歧义:
'04-01-2021'在不同数据库会被解析为不同日期,建议改为ISO标准格式'2021-04-01'避免筛选范围错误。 - 别名不规范:将按月截断的日期命名为
week、将金额求和结果命名为SQL关键字count,容易引发逻辑混淆,建议替换为语义化别名。 - 月份别名固定易错位:当前写死的April/May/June别名仅匹配「当前时间减6/5/4个月对应这三个月」的场景,时间变动后别名和统计月份会不匹配,可根据需求选择动态生成别名或直接用固定月份值做判断。
调整后参考代码
months_counter as (SELECT date_trunc('month', job.date) as stat_month, client.company_name as company, sum(job.client_charge) as month_charge FROM client -- 仅需统计有消费的客户用INNER JOIN,需要保留无消费客户改回LEFT JOIN INNER JOIN job on job.client_id = client.id -- 因WHERE有user的过滤条件,直接用INNER JOIN更清晰,需保留无对应user的客户就改回LEFT JOIN,同时把date_joined条件移到ON子句 INNER JOIN user on user.id = client.user_id WHERE user.date_joined > '2021-04-01' GROUP BY 1,2 ) select company, coalesce(sum(CASE WHEN stat_month = date_trunc('month', NOW()) - interval '6 month' THEN month_charge ELSE 0 END), 0) AS "四月", coalesce(sum(CASE WHEN stat_month = date_trunc('month', NOW()) - interval '5 month' THEN month_charge ELSE 0 END), 0) AS "五月", coalesce(sum(CASE WHEN stat_month = date_trunc('month', NOW()) - interval '4 month' THEN month_charge ELSE 0 END), 0) AS "六月" from months_counter GROUP BY 1
内容的提问来源于stack exchange,提问作者RMolok
相关产品推荐
相关产品推荐

