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

如何实现仅匹配注册年月时按状态按月统计客户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

关键调整说明
  1. 年月匹配逻辑:将日期匹配条件从WHERE子句移至JOIN关联条件,通过FORMAT函数把两个日期统一转换为yyyy-MM格式,实现仅对比年月、忽略日部分的匹配需求。
  2. 去重统计:使用COUNT(DISTINCT c.ID)避免同一客户在同一年月同一状态下被重复统计,若数据本身保证ID+年月+状态唯一,也可简化为COUNT(c.ID)。
  3. 可读性优化:直接用别名Year_Month排序,替代原语句的ORDER BY 1,提升代码可读性。

内容的提问来源于stack exchange,提问作者FernandoAnalytics

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:46:20