统计数据库表t_abc中,近7个月内每个月创建记录的数量。如果某个月没有记录,则显示记录数为0

SELECT 
    DATE_FORMAT(month_dates.month_start, '%Y-%m') AS Month, 
    IFNULL(COUNT(t.create_time), 0) AS RecordCount
FROM 
    (
    SELECT @cdate := date_add( @cdate, INTERVAL - 1 MONTH ) month_start 
			FROM
		( SELECT @cdate := date_add( CURDATE(), INTERVAL 1 MONTH ) FROM t_abc ) car limit 7
						
    ) AS month_dates
LEFT JOIN 
    t_abc t ON DATE_FORMAT(t.create_time, '%Y-%m') = DATE_FORMAT(month_dates.month_start, '%Y-%m')
GROUP BY 
    Month
ORDER BY 
    Month;
  1. 生成近7个月的月份序列

    • 初始化变量 @cdate:

      • 首先,在子查询 (SELECT @cdate := DATE_ADD(CURDATE(), INTERVAL 1 MONTH) FROM t_abc) 中,使用 CURDATE() 函数获取当前日期,然后通过 DATE_ADD() 函数将当前日期向前推进1个月,得到的结果赋值给用户定义变量 @cdate。这里使用 t_battery 表进行查询实际上是为了执行初始化操作,因为MySQL不允许直接在顶层查询外定义和初始化变量而不引用任何表,但实际上并不从t_abc表中取出数据。
    • 生成月份序列:

      • 在外部查询中,SELECT @cdate := DATE_ADD(@cdate, INTERVAL - 1 MONTH) month_start 语句每次迭代都将 @cdate 变量的值减少1个月,生成一个新的月份作为 month_start 列的值。
      • FROM (子查询) car 部分确保了初始化步骤被执行,而 LIMIT 7 确保只生成7个这样的月份记录。
    • 结果输出:

      • 最终,这个查询会输出7行数据,每一行代表一个月份,格式为'YYYY-MM',从当前日期的下一个月开始倒推7个月。
  2. 左连接到实际数据表:

    • 主查询部分通过LEFT JOIN将生成的月份序列month_dates表与实际的记录表t_abc进行连接。连接条件是将t_abc表中的create_time字段(记录创建时间)按月格式化后,与月份序列中的月份匹配。LEFT JOIN确保了即使某些月份在t_abc表中没有对应记录,也会出现在结果集中。
  3. 计算每个月的记录数量:

    • 使用IFNULL(COUNT(t.create_time), 0)来计算每个月的记录数量。COUNT(t.create_time)计算每个月实际的记录数,而IFNULL函数确保了如果某个月份没有记录(即COUNT结果为NULL),则将其替换为0,以完整展示每个月的数据情况。
  4. 分组并排序:

    • GROUP BY Month按照月份对结果进行分组,确保每个唯一的月份只有一行数据,展示了该月的记录总数。
    • ORDER BY Month按月份升序排序最终的结果集,使得月份序列有序展现。

综上所述,此查询提供了未来7个月内,每个月在t_abc表中创建记录的统计情况,即便某月无记录也明确标记为0条。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值