当前位置: 首页 > news >正文

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

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

#如果要在补齐月份使用这种
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 monthUNION ALLSELECT m.date as month,0 AS number_of_invoices
FROM ( SELECT DATE_FORMAT(CURDATE(), '%Y-%m') AS dateUNION ALLSELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH), '%Y-%m') dateUNION ALLSELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 2 MONTH), '%Y-%m') dateUNION ALLSELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 3 MONTH), '%Y-%m') dateUNION ALLSELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 4 MONTH), '%Y-%m') dateUNION ALLSELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 5 MONTH), '%Y-%m') date	) m
where not exists(SELECT DATE_FORMAT(f.date, '%Y-%m') AS dateFROM in_storeage_form fWHERE date BETWEEN DATE_SUB(CURDATE(), INTERVAL 6 MONTH) AND CURDATE()and  DATE_FORMAT(f.date, '%Y-%m') = m.dateGROUP BY date) 
order by month desc

在这里插入图片描述

结论

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

相关文章:

  • STM32day2
  • 【AI视野·今日Sound 声学论文速览 第五十四期】Thu, 7 Mar 2024
  • 安装zabbix
  • C++ 特殊的类设计
  • 小米汽车上市进入倒计时,已开启内部试驾
  • 1.3 vue ui框架-element-ui框架
  • nicegui学习使用
  • 大语言模型系列-GPT-2
  • 解读电影级视频生成模型 MovieFactory
  • VUE——v-once指令
  • 一些硬件知识(六)
  • 24/03/07总结
  • 清除Mac OS上Xcode占用的空间
  • 第一次捡垃圾
  • 自然语言处理 | 语言模型(LM) 浅析
  • Docker 笔记(2):Dockerfile
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • Linux中的硬链接与软链接
  • php ci框架整合银盛支付
  • PV统计优化设计
  • Ruby 2.x 源代码分析:扩展 概述
  • Selenium实战教程系列(二)---元素定位
  • Vultr 教程目录
  • Webpack 4x 之路 ( 四 )
  • 当SetTimeout遇到了字符串
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 关于字符编码你应该知道的事情
  • 悄悄地说一个bug
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 算法系列——算法入门之递归分而治之思想的实现
  • 自动记录MySQL慢查询快照脚本
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • #include到底该写在哪
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (Python第六天)文件处理
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (一)基于IDEA的JAVA基础1
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .Net IE10 _doPostBack 未定义
  • .net 生成二级域名
  • .Net 应用中使用dot trace进行性能诊断
  • .net快速开发框架源码分享
  • .Net中间语言BeforeFieldInit