当前位置:   article > 正文

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

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

起因

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

实现

#如果每个月都有数据的话是比较简单的
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

不过这种方式可能会存在漏掉月份的情况
在这里插入图片描述

#如果要在补齐月份使用这种
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

在这里插入图片描述

结论

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/232224
推荐阅读
相关标签
  

闽ICP备14008679号