Mysql按照月份分组统计数据,当月无数据则填充0

目录

起因

最近有个需求需要在sql中实现获取近半年的统计数据,本来以为挺简单的,不过这个项目数据基本没有,在此情况下还要实现获取近半年的数据就没办法简单group by了

实现

bash 复制代码
#如果每个月都有数据的话是比较简单的
SELECT 
    DATE_FORMAT(date, '%Y-%m') AS month, 
    COUNT(*) AS number_of_invoices
FROM 
    in_storeage_form
WHERE 
    date BETWEEN DATE_SUB(CURDATE(), INTERVAL 6 MONTH) AND CURDATE()
GROUP BY 
    month

不过这种方式可能会存在漏掉月份的情况

bash 复制代码
#如果要在补齐月份使用这种
SELECT 
    DATE_FORMAT(date, '%Y-%m') AS month, 
    COUNT(*) AS number_of_invoices
FROM 
    in_storeage_form
WHERE 
    date BETWEEN DATE_SUB(CURDATE(), INTERVAL 6 MONTH) AND CURDATE()
GROUP BY 
    month
		
UNION ALL

SELECT 
    m.date as month,
    0 AS number_of_invoices
FROM 
    ( SELECT DATE_FORMAT(CURDATE(), '%Y-%m') AS date
    UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m') date
    UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 2 MONTH), '%Y-%m') date
    UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 3 MONTH), '%Y-%m') date
    UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 4 MONTH), '%Y-%m') date
	UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 5 MONTH), '%Y-%m') date	) m
where not exists(
		SELECT 
    		DATE_FORMAT(f.date, '%Y-%m') AS date
		FROM in_storeage_form f
		WHERE date BETWEEN DATE_SUB(CURDATE(), INTERVAL 6 MONTH) AND CURDATE()
			and  DATE_FORMAT(f.date, '%Y-%m') = m.date
		GROUP BY date
	) 
order by month desc

结论

先通过普通的计算有数据的月份,在获取近6个月到底是哪几个月,通过这几个月去跟有数据的几个月做一个筛选,获取到没数据的那几个月,再去将没数据的那几个月设为0就OK了

相关推荐
weixin_568996067 分钟前
mysql如何配置大页内存_mysql large-pages开启方法
jvm·数据库·python
HHHHH1010HHHHH8 分钟前
HTML怎么创建评论区域_HTML嵌套评论语义结构【详解】
jvm·数据库·python
Absurd5878 分钟前
C#怎么模拟键盘按键输入_C#如何实现自动化脚本【教程】
jvm·数据库·python
Chasing__Dreams13 分钟前
Redis--基础知识点--29--Redis瓶颈
数据库·redis·php
amIZ AUSK20 分钟前
实操解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错的问题
数据库·postgresql
gmaajt28 分钟前
Golang怎么读取环境变量_Golang如何用os.Getenv获取系统环境变量【基础】
jvm·数据库·python
2601_9491942631 分钟前
Redis的安装教程(Windows+Linux)【超详细】
linux·数据库·redis
傻啦嘿哟35 分钟前
Python 文件批量处理:重命名/备份/同步运维实战指南
linux·数据库·github
m0_5964063736 分钟前
CSS复杂组件如何拆解_使用Sass将组件逻辑细化为小文件
jvm·数据库·python
cyber_两只龙宝36 分钟前
【Oracle】 Oracle之SQL的子查询
linux·运维·数据库·sql·云原生·oracle