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了

相关推荐
怪兽20142 小时前
什么是 Redis?
java·数据库·redis·缓存·面试
wangmengxxw2 小时前
Redis概述
数据库·redis·缓存
笔生花2 小时前
【实战-12】flink版本表
数据库·sql·flink
花月C2 小时前
高效查找数据的数据结构—MySQL 索引
数据结构·数据库·mysql
我笔记3 小时前
关系型数据库RDBMS与非关系型数据库NoSQL区别
数据库·oracle
PiscesCanon3 小时前
达梦开启awr功能报错:[-7160]:Object [DBMS_WORKLOAD_REPOSITORY_DATA_LOW] is invalid
数据库·mysql
SZ1701102313 小时前
新机器 银河麒麟 安装 达梦数据库
数据库
清风6666663 小时前
基于单片机的图书馆智能座位管理平台
数据库·单片机·嵌入式硬件·毕业设计·课程设计
SirLancelot14 小时前
MongoDB-基本介绍(一)基本概念、特点、适用场景、技术选型
java·数据库·分布式·后端·mongodb·软件工程·软件构建
安冬的码畜日常4 小时前
【JUnit实战3_02】第二章:探索 JUnit 的核心功能(一)
数据库·junit·sqlserver