MySQL查询优化需求:统计2017年企业签约后未付费时长分布
嘿,作为MySQL新手能想到分步统计已经很棒啦!针对你要覆盖3-12个月未付费企业数的需求,其实可以用条件聚合的方式一次性搞定所有区间,不用写一堆重复的查询,既简洁又高效。
核心思路
通过CASE WHEN把不同的签约后未付费时长区间做分组,再用COUNT()一次性统计每个区间的企业数量,避免多次重复查询数据库。
示例SQL代码
假设你的企业表名为enterprises,包含sign_date(签约日期)、first_pay_date(首次付费日期)两个核心字段,以下是适配需求的查询语句:
SELECT -- 按签约后未付费时长分组 CASE WHEN TIMESTAMPDIFF(MONTH, sign_date, '2017-12-31') = 1 THEN '签约1个月未付费' WHEN TIMESTAMPDIFF(MONTH, sign_date, '2017-12-31') = 2 THEN '签约2个月未付费' WHEN TIMESTAMPDIFF(MONTH, sign_date, '2017-12-31') BETWEEN 3 AND 12 THEN '签约3-12个月未付费' ELSE '其他(签约不足1个月)' END AS duration_group, -- 统计每个区间的企业数量 COUNT(*) AS enterprise_count FROM enterprises WHERE -- 限定2017年签约的企业 sign_date BETWEEN '2017-01-01' AND '2017-12-31' -- 未付费判定:首次付费日期为空,或2017年内未产生付费 AND (first_pay_date IS NULL OR first_pay_date > '2017-12-31') GROUP BY duration_group ORDER BY -- 按区间顺序排序,结果更直观 CASE duration_group WHEN '签约1个月未付费' THEN 1 WHEN '签约2个月未付费' THEN 2 WHEN '签约3-12个月未付费' THEN 3 ELSE 4 END;
为什么这个方案更简洁?
- 一次性输出所有需要的统计结果,不用写多个
SELECT再通过UNION拼接 - 用
TIMESTAMPDIFF函数精准计算月份差,避免手动计算日期区间的误差 - 逻辑集中,后续要调整区间(比如新增13-24个月),只需要修改
CASE WHEN里的条件即可
小提示
如果你的“未付费”定义是企业从未产生过付费行为(不管时间),可以把WHERE里的未付费判定简化为first_pay_date IS NULL即可。
内容的提问来源于stack exchange,提问作者ryan
相关产品推荐
相关产品推荐

