MySQL按天分组统计一定时间内的数据实例(没有数据补0)
作者:吃榴莲不吐葡萄皮 发布时间:2024-01-17 07:42:08
标签:mysql,分组,统计
简介
工作中偶尔会出现一个查询数据的需求,那就是需要按天统计近一个月或其它一段时间内每天的所有记录或者分组数据,没有数据则自动补0。
一般情况下我们都会过滤没有数据的时间,但前端拿到后端返回的数据想直接展示连续性数据变化时要进行再处理,下面介绍如何通过sql语句直接满足需求。
思路分析
如果能每天都有数据,可以直接使用最简单的查询节省时间。
要能够展示每天的日期就要创建一张日期虚拟表作为连接表。
要使每天数据不为null,使用
IFNULL(count,0)
函数进行判断是否补零。
SQL实现
下面以查询近一个月每天的数据为示例展示SQL实现。
按天统计数据
1.没数据的一天过滤
SELECT DATE(CREATE_DATE) as date, COUNT(1) as count
FROM 表
WHERE 字段 = '1'
AND DATE_FORMAT(CREATE_DATE, '%Y-%m-%d') >=
DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 30 DAY), '%Y-%m-%d')
GROUP BY DATE(CREATE_DATE);
查询结果:
2.没数据的一天有日期总数为null
SELECT DATE_FORMAT(date,'%Y-%m-%d') AS date,data.num AS count
FROM (
SELECT @days := DATE_ADD(@days, INTERVAL - 1 DAY) AS date
FROM (SELECT @days := DATE_ADD(CURDATE(), INTERVAL + 1 DAY)
FROM 表
) day
WHERE DATE_FORMAT(@days, '%Y-%m-%d') >=
DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 29 DAY), '%Y-%m-%d')
ORDER BY date
) dates
LEFT JOIN (
SELECT COUNT(1) AS num, DATE(CREATE_DATE) AS time
FROM audit_work_sheet
WHERE 字段 = '1'
AND DATE_FORMAT(CREATE_DATE, '%Y-%m-%d %H:%i:%S') >=
DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 30 DAY), '%Y-%m-%d %H:%i:%S')
GROUP BY DATE(CREATE_DATE)
) data ON DATE(time) = date
ORDER BY date;
查询结果:
3.没数据的一天有日期总数为0
SELECT DATE_FORMAT(date,'%Y-%m-%d') AS date,IFNULL(data.num, 0) AS count
FROM (
SELECT @days := DATE_ADD(@days, INTERVAL - 1 DAY) AS date
FROM (SELECT @days := DATE_ADD(CURDATE(), INTERVAL + 1 DAY)
FROM 表
) day
WHERE DATE_FORMAT(@days, '%Y-%m-%d') >=
DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 29 DAY), '%Y-%m-%d')
ORDER BY date
) dates
LEFT JOIN (
SELECT COUNT(1) AS num, DATE(CREATE_DATE) AS time
FROM audit_work_sheet
WHERE 字段 = '1'
AND DATE_FORMAT(CREATE_DATE, '%Y-%m-%d %H:%i:%S') >=
DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 30 DAY), '%Y-%m-%d %H:%i:%S')
GROUP BY DATE(CREATE_DATE)
) data ON DATE(time) = date
ORDER BY date;
查询结果
4.加入其它分组字段没数据的一天有日期总数为0
SELECT DATE_FORMAT(date,'%Y-%m-%d') AS date,data.level AS level, IFNULL(data.num, 0) AS count
FROM (
SELECT @days := DATE_ADD(@days, INTERVAL - 1 DAY) AS date
FROM (SELECT @days := DATE_ADD(CURDATE(), INTERVAL + 1 DAY)
FROM 表
) day
WHERE DATE_FORMAT(@days, '%Y-%m-%d') >=
DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 29 DAY), '%Y-%m-%d')
ORDER BY date
) dates
LEFT JOIN (
SELECT RISK_LEVEL AS level, COUNT(1) AS num, DATE(CREATE_DATE) AS time
FROM audit_work_sheet
WHERE 字段 = '1'
AND DATE_FORMAT(CREATE_DATE, '%Y-%m-%d %H:%i:%S') >=
DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 30 DAY), '%Y-%m-%d %H:%i:%S')
GROUP BY DATE(CREATE_DATE),level
) data ON DATE(time) = date
ORDER BY date,level;
查询结果
(中间过多数据不展示)
来源:https://blog.csdn.net/qq_38951230/article/details/127443836


猜你喜欢
- 操作步骤进入命令行环境。我使用的是conda。有两种方式进入命令行。方法1:通过anconda navigator界面,选择environm
- 前言最近在用yolov5参加比赛,yolov5的技巧很多,仅仅用来参加比赛,着实有点浪费,所以有必要好好学习一番,在认真学习之前,首先向yo
- 跨文件使用全局变量有多个py文件同时使用一个全局变量时,那应该如何使跨文件,用这个全局变量呢?1. 错误示范file1.py代码如下:num
- 1,为了获取视频,你应该创建一个 VideoCapture 对象。他的参数可以是设备的索引号,或者是一个视频文件。设备索引号就是在指定要使用
- 简介现在的网站没有 HTTPS 都不好意思见人了.超文本传输安全协议(英语:HyperText Transfer Protocol Secu
- /usr/sbin/groupadd mysql/usr/sbin/useradd -g mysql mysqlunzip mysql-5.
- 通用load/write方法手动指定选项Spark SQL的DataFrame接口支持多种数据源的操作。一个DataFrame可以进行RDD
- 数据库复制:简单来说,数据库复制就是由两台服务器,主服务器和备份服务器,主服务器修改后,备份服务器自动修改。复制的模式有两种:推送模式和请求
- 99bill: 1.md5.asp 代码如下:<% '''''''&
- 本文实例为大家分享了使用python3制作的表白神器,供大家参考,具体内容如下使用python3制作的小玩意,哪里需要改造的,望各位评论一下
- 前言pandas对数据框也可以像excel一样进行数据透视表整合之类的操作。主要是针对分类数据进行操作,还可以计算数值型数据,去满足复杂的分
- 1、变量的定义定义变量语法格式:variable_name = variable_namevariable_name表示变量名;variab
- 前言日常工作中我们经常接触到一些文本类信息,需要从文本中解析出数据信息,然后再进行数据分析操作。而对文本类信息进行解析是一件比较头秃的事情,
- 今天和某朋友聊天,谈到他们公司的一个小问题。如下:表A设备表,存储MAC地址,省份,城市,区。表B软件表,存储MAC地址,软件名字。功能是可
- Python中函数参数的定义主要有四种方式:1. F(arg1,arg2,…)这是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用
- 单下划线与双下划线在 python 中,会看到 _xx, xx 以及 __xx 这样的变量或者函数名,在这里做一个简要的总结。_xx:保护(
- 项目需要把部分代码移植到 Golang , 之前用 Laravel 封装的写起来很舒服,在 Golang 里只能自动动手实现.一开始想的是使
- 问:假如我的一个表里含有(a,b,c,d)和(a,b)形成组合键。我能在列值中写这个查询吗?例如: select a,c,d from my
- 先举个例子,以前负责教育培训类网站的时候,曾经接到过这样一个项目,需求方希望做一个充满趣味性的新手入门频道,页面要炫,最好是flash,用户
- 问题描述有时在遇到一个文本需要统计文本内词汇的次数 的时候 ,可以用一个简单的python程序来实现。解决方案首先需要的是一个文本文件(.t