Mysql查询统计最近12个月,每个月的数量,并且显示每个月份,如果月份没有数据量需要以“0”填充

第一种:

可以使用MySQL的日期和时间函数来生成包含最近12个月的日期,并且使用LEFT JOIN 和 GROUP BY 语句来统计每个月的数量。下面是一个示例查询:

SELECT DATE_FORMAT(date_range.month, '%Y-%m') AS month,COUNT(your_table.id) AS count
FROM (SELECT CURDATE() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS monthFROM (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS aCROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS bCROSS JOIN (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS c) AS date_range
LEFT JOIN your_table ON DATE_FORMAT(date_range.month, '%Y-%m') = DATE_FORMAT(your_table.date_column, '%Y-%m')
WHERE date_range.month >= DATE_FORMAT(CURDATE() - INTERVAL 11 MONTH, '%Y-%m')
GROUP BY month
ORDER BY month;

请注意以下几点:

  1. your_table 是你的数据表名,date_column 是包含日期信息的列名。
  2. 此查询首先生成最近12个月的日期范围,然后使用 LEFT JOIN 将这些日期范围与你的表连接。LEFT JOIN 确保即使某些月份没有匹配的数据,也会将其列出。
  3. 使用 DATE_FORMAT 函数来提取月份和年份,并将结果格式化为 “YYYY-MM”。
  4. 如果你的数据表中没有数据的月份,它将在结果中显示为零。

第二种:

可以通过编写带有 CASE 语句的查询来实现这个目标。 CASE 语句可以帮助您检查每个月份是否有数据,并返回对应的数量。以下是一个示例:

SELECTmonth_numbers.month_number,SUM(CASE WHEN MONTH(your_table.date_column) = month_numbers.month_number THEN 1 ELSE 0 END) AS month_count
FROM(SELECT 1 AS month_numberUNION ALL SELECT 2UNION ALL SELECT 3UNION ALL SELECT 4UNION ALL SELECT 5UNION ALL SELECT 6UNION ALL SELECT 7UNION ALL SELECT 8UNION ALL SELECT 9UNION ALL SELECT 10UNION ALL SELECT 11UNION ALL SELECT 12) AS month_numbers
LEFT JOIN your_table
ON MONTH(your_table.date_column) = month_numbers.month_number
WHERE your_table.date_column >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
GROUP BY month_numbers.month_number
ORDER BY month_numbers.month_number;

请注意,您仍然需要将 your_table 替换为您的实际表名,并将 date_column 替换为您的实际日期列名称。这个查询不会创建新的表,而是使用子查询来生成一个包含1到12个月的临时表。

第三种:

SELECT a.click_month,IFNULL(b.READCOUNT,0) AS READCOUNT
FROM ( SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 12 MONTH),'%Y-%m') AS click_month UNION ALLSELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 11 MONTH),'%Y-%m') AS click_month UNION ALLSELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 10 MONTH),'%Y-%m') AS click_month UNION ALL SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 9 MONTH),'%Y-%m') AS click_month UNION ALL SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 8 MONTH),'%Y-%m') AS click_month UNION ALL SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 7 MONTH),'%Y-%m') AS click_month UNION ALL SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 6 MONTH),'%Y-%m') AS click_month UNION ALL SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 5 MONTH),'%Y-%m') AS click_month UNION ALL SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 4 MONTH),'%Y-%m') AS click_month UNION ALL SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 3 MONTH),'%Y-%m') AS click_month UNION ALL SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 2 MONTH),'%Y-%m') AS click_month UNION ALL SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 1 MONTH),'%Y-%m') AS click_month UNION ALL SELECT DATE_FORMAT(CURDATE(),'%Y-%m') AS click_month ) a LEFT JOIN ( SELECT DATE_FORMAT(borrow_time,'%Y-%m') AS DATETIME, count(id) AS READCOUNTFROM archive_borrow_apply WHERE archive_company_id=1645 and del=false and status in('4','6' ,'7')GROUP BY DATE_FORMAT(borrow_time,'%Y-%m') ) b ON a.click_month = b.datetime
order by a.click_month 

archive_borrow_apply :你的表名

borrow_time:表中的时间字段

第四种:MySQL 5.8以下 是不支持 WITH RECURSIVE

可以使用MySQL中的 WITH RECURSIVE 来生成一个数字序列,然后将其与您的数据表进行连接。以下是一个示例查询:

WITH RECURSIVE month_numbers AS (SELECT 1 AS month_numberUNION ALLSELECT month_number + 1 FROM month_numbers WHERE month_number < 12
)
SELECTmonth_numbers.month_number,IFNULL(COUNT(your_table.id), 0) AS month_count
FROMmonth_numbers
LEFT JOIN your_table
ON MONTH(your_table.date_column) = month_numbers.month_numberAND your_table.date_column >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
GROUP BY month_numbers.month_number
ORDER BY month_numbers.month_number;

这个查询使用 WITH RECURSIVE 构建了一个包含数字序列的临时表 month_numbers,然后将其与您的数据表进行连接。在 LEFT JOIN 子句中,它还限制了日期范围以仅包括最近的12个月数据。最后,使用 IFNULL 函数来处理空值,如果某个月份没有数据,则将数量设置为零。

这种方法与之前的方法相比,使查询更加紧凑和易读,而不需要显式列举数字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/690586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue | (一)Vue核心(上) | 尚硅谷Vue2.0+Vue3.0全套教程

文章目录 &#x1f4da;Vue简介&#x1f4da;初识Vue&#x1f4da;模板语法&#x1f4da;数据绑定&#x1f4da;MVVM模型&#x1f4da;数据代理&#x1f407;回顾Object.defineproperty方法&#x1f407;何为数据代理&#x1f407;Vue中的数据代理 &#x1f4da;事件处理&#…

游戏分组/王者荣耀

题目描述 部门准备举办一场王者荣耀表演赛&#xff0c;有 10 名游戏爱好者参与&#xff0c;分 5 为两队&#xff0c;每队 5 人。 每位参与者都有一个评分&#xff0c;代表着他的游戏水平。 为了表演赛尽可能精彩&#xff0c;我们需要把 10 名参赛者分为实力尽量相近的两队。一…

C语言 判断当前存储大小端问题

1.代码1 #include<stdio.h>int check_sys(){int a1;return *(char*)&a;//将int*强制转换为char* 判断一个字节的内容就知道当前存储模式 } int main(){if(1check_sys())printf("小端");elseprintf("大端");return 0; }2.代码2 使用联合体判断大…

优先队列的用法

介绍 英文名-priority_queue队首元素为当前优先级最高的 访问 只能通过top()函数来访问队首元素 #include <iostream> #include <queue>//调用queue头文件 using namespace std; int main(){priority_queue<int> pq1;//定义&#xff1a;默认数字越大优先…

基于java的眼镜店仓库管理系统

源码获取&#xff0c;加V&#xff1a;qq2056908377 摘要&#xff1a; 随着电子商务的兴起&#xff0c;越来越多的商家选择在线销售他们的产品。眼镜店作为零售业的一种&#xff0c;也不例外。随着市场需求的不断增加&#xff0c;眼镜店需要更加高效的管理他们的仓库和库存&…

Mysql 权限与安全管理

0 引言 MySQL是一个多用户数据库&#xff0c;具有功能强大的访问控制系统&#xff0c;可以为不同用户指定允许的权限。MySQL用户可以分为普通用户和root用户。root用户是超级管理员&#xff0c;拥有所有权限&#xff0c;包括创建用户、删除用户和修改用户的密码等管理权限&…

LeetCode21.合并两个有序链表

题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 &#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 思路 创建一个新的链表头节点&#xff08;dummyNode&#xff09;和一个…

RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?<= , (?= , (?<! , (?!

RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?< , (? , (?<! , (?! 有好多种称呼 (?< , (? , (?<! , (?! 有好多种称呼 , 我称为: 左限定, 右限定, 左否定, 右否定 (?<左限定)    (?右限定)(?<!左否定)    (?!右限定) 再…

通俗易懂,Spring Bean生命周期管理的理解

目录 1、实例化阶段 2、初始化阶段 3、销毁阶段 总结 在Spring框架中&#xff0c;Bean是最基本的组件&#xff0c;它是Spring框架中的一个Java对象。 下面通过Bean来理解bean的生命周期&#xff1a; Bean(initMethod "customInit", destroyMethod "cust…

阿里云个人建站笔记

导航 一、购买ECS服务器二、配置mysql&#xff08;一&#xff09;安装Mysql步骤一&#xff1a;安装mysql步骤二&#xff1a;配置MySQL步骤三&#xff1a;远程访问MySQL数据库 &#xff08;二&#xff09;给实例配置安全组策略&#xff08;三&#xff09;设置防火墙 一、购买ECS…

.ma1x0勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

尊敬的读者&#xff1a; 数据安全问题备受关注。而勒索病毒是其中一种最为恶劣的威胁之一。其中&#xff0c;.ma1x0勒索病毒备受人们担忧&#xff0c;因其可将用户的数据文件加密&#xff0c;并要求支付赎金以解密文件。本文将介绍.ma1x0勒索病毒的特征、预防方法以及如何恢复…

C# 使用Newtonsoft.Json来读取JOSN数组

怎么在C#工程中安装Newtonsoft在这里就不提了&#xff0c;随便搜一下就有教程反正也是用NuGet包管理器安装。这里记录一下怎么读取JSON节点。 假如有如下JSON&#xff1a; { "春哥": "纯爷们", "data": { "chun": 5…

transformer-Attention is All You Need(二)

transformer中的解码器 解码器层 每个解码器层根据给定的输入向目标方向进行特征提取&#xff0c;即完成解码过程 transformer的解码器也是一个自回归模型&#xff0c;根据编码器的结果以及上一次预测的结果&#xff0c;对下一次可能出现的值进行特征表示。它也是由N层完全相同…

循环队列|超详细|数据结构学习讲解与笔记

队列元素先进先出队列只允许在线性表的一端进行操作&#xff0c;是一种操作受限的线性表 队列的基本操作 InItQueue(&Q)初始化队列&#xff0c;构造一个空队列 QEmptyQueue(Q)队列判空FullQueue(Q)队列判满EnQueue(&Q , x)入队操作DeQueue(&Q , &x)出队操作G…

Kafka的介绍

文章目录 一、介绍二、消息队列通信的模式三、特性四、使用场景五、核心概念 一、介绍 kafka是一个分布式的发布订阅消息系统基于Zookeeper协调最初由Linkedin公司开发&#xff0c;于2010年贡献给了Apache基金会并成为顶级开源项目Kafka的核心是由Scala语言编写&#xff0c;Ka…

SpringBoot中导出excel文件

依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency> 代码实现细节 package com.lyh.mp.utils;import com.lyh.mp.entity.User; import org.apache.poi…

OpenAI新爆款Sora,大佬们怎么看?

OpenAI新爆款Sora的热度持续发酵&#xff0c;在科技圈的刷屏阵仗都快赶上正月初五迎财神了。 智东西2月17日报道&#xff0c;这两天&#xff0c;OpenAI首款文生视频大模型Sora以黑马之姿占据AI领域话题中心&#xff0c;马斯克、杨立昆、贾扬清、Jim Fan、谢赛宁、周鸿祎、李志…

【动态规划专栏】专题一:斐波那契数列模型--------2.三步问题

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

Spring Cloud Zuul:API 网关

1. 理解 API 网关 API网关在现代微服务架构中扮演着至关重要的角色。它充当着服务的入口&#xff0c;负责处理外部请求、路由流量、安全认证、监控日志等功能。本节将深入探讨API网关的定义、作用及其在Spring Cloud中的具体实现Spring Cloud Zuul。 1.1 什么是 API 网关 AP…

数据结构-最短路径(Dijkstra算法与Floyd算法)

介绍 对于网图来说&#xff0c;最短路径是指两顶点之间经过的边上权值之和最少的路径&#xff0c;其路径上第一个点记为源点&#xff0c;最后一个为终点。 计算最短路径有两个经典算法&#xff0c;即迪杰斯特拉&#xff08;Dijkstra&#xff09;算法与弗洛伊德&#xff08;Fl…