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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:42:04