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了

相关推荐
Knight_AL16 小时前
MySQL 中 UPDATE 语句的执行过程全解析
数据库·mysql
yngsqq16 小时前
兰顿蚂蚁——CAD二次开发
数据库
梁萌17 小时前
ShardingSphere分库分表实战
数据库·mysql·实战·shardingsphere·分库分表
川石课堂软件测试17 小时前
Mysql中触发器使用详详详详详解~
数据库·redis·功能测试·mysql·oracle·单元测试·自动化
鹏说大数据17 小时前
数据治理项目实战系列6-数据治理架构设计实战,流程 + 工具双架构拆解
大数据·数据库·架构
程序员游老板18 小时前
基于SpringBoot3_vue3_MybatisPlus_Mysql_Maven的社区养老系统/养老院管理系统
java·spring boot·mysql·毕业设计·软件工程·信息与通信·毕设
唯余旧忆18 小时前
【数据写入】达梦数据库(dm8)merge into写入时序数据速度慢的问题处理
数据库
小二·18 小时前
MyBatis基础入门《十四》多租户架构实战:基于 MyBatis 实现 SaaS 系统的动态数据隔离
数据库·架构·mybatis
白衣衬衫 两袖清风18 小时前
SQL联查案例
数据库·sql
ShirleyWang01218 小时前
VMware如何导入vmdk文件
linux·数据库