You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

客户月度消费统计及总营收拆分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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:15:03