如何实现仅匹配注册年月时按状态按月统计客户ID数量?
需求与问题描述
现有两张业务表:
C_Status表
ID(pk) Time_Period Statuses 1 2020-10-01 Silver 2 2021-01-01 Gold 3 2020-11-01 Bronze 1 2020-12-01 Bronze 1 2021-03-01 Platinum 2 2020-10-01 Bronze 3 2021-04-01 Diamond 2 2021-04-01 Bronze 1 2020-04-01 Gold
Registrations表
C_ID(pk) Reg_Date 1 2020-12-06 2 2021-04-22 3 2020-11-14
核心需求:按状态、按月统计客户数量,仅统计在对应年月完成注册的客户,只需匹配注册日期的年和月,无需考虑无注册记录的月份。
现有查询语句仅匹配完整日期(包含日部分),无法满足需求:
SELECT FORMAT(Time_Period , 'yyyy-MM') AS Year_Month, Statuses, COUNT(ID) AS Count_Status FROM C_Status c JOIN Registrations r ON r.C_ID = c.ID WHERE r.Reg_Date = c.Time_period GROUP BY FORMAT(Time_Period , 'yyyy-MM'), Statuses ORDER BY 1
预期输出结果:
Year_month Statuses Count_Status 2020-11 Bronze 1 2020-12 Bronze 1 2021-04 Bronze 1 2021-04 Diamond 1
修改后的查询语句
SELECT FORMAT(c.Time_Period, 'yyyy-MM') AS Year_Month, c.Statuses, COUNT(DISTINCT c.ID) AS Count_Status FROM C_Status c JOIN Registrations r ON r.C_ID = c.ID AND FORMAT(r.Reg_Date, 'yyyy-MM') = FORMAT(c.Time_Period, 'yyyy-MM') GROUP BY FORMAT(c.Time_Period, 'yyyy-MM'), c.Statuses ORDER BY Year_Month
关键调整说明
- 年月匹配逻辑:将日期匹配条件从
WHERE子句移至JOIN关联条件,通过FORMAT函数把两个日期统一转换为yyyy-MM格式,实现仅对比年月、忽略日部分的匹配需求。 - 去重统计:使用
COUNT(DISTINCT c.ID)避免同一客户在同一年月同一状态下被重复统计,若数据本身保证ID+年月+状态唯一,也可简化为COUNT(c.ID)。 - 可读性优化:直接用别名
Year_Month排序,替代原语句的ORDER BY 1,提升代码可读性。
内容的提问来源于stack exchange,提问作者FernandoAnalytics
相关产品推荐
相关产品推荐

