Mysql按日期分组(group by)查询统计的时候,没有数据补0的解决办法
转载自:http://blog.csdn.net/jie11447416/article/details/50887888
1、案例中的数据结构和数据如下

2、在没有解决的时候,是这样的
SELECT date(downtime) AS dday, count(*) AS num FROM re_device GROUP BY dday
得到如下结果,如果那天没有数据,那麽就会没有记录

我们看到,时间不连续,没有2016-3-05这一天的,这样本来不是问题,但是,我拿出来的数据,还要画出图表呀,没有当然不行,我们需要的是下面这个样子的。

简单的说就是,没有数据,就要补充一个0.
3、下面我们讲实现
我们要生成一个日历的表,然后和原来的数据,联合查询,说到这里,大家就知道很low了,但是,限于我水平有限,研究这个问题,半天,这个是我找到的比较好的一种实现方式。如果你又更好的,也请你给我说下。
执行下面的sql,直接诶生成日历的表(calendar)
CREATE TABLE num (i int);-- 创建一个表用来储存0-9的数字
INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);-- 生成0-9的数字,方便以后计算时间 CREATE TABLE if not exists calendar(datelist date); -- 生成一个存储日期的表,datalist是字段名 -- 这里是生成并插入日期数据
INSERT INTO calendar(datelist) SELECT
adddate(
( -- 这里的起始日期,你可以换成当前日期
DATE_FORMAT("2016-1-1", '%Y-%m-%d')
),
numlist.id
) AS `date`
FROM
(
SELECT
n1.i + n10.i * 10 + n100.i * 100 + n1000.i * 1000+ n10000.i * 10000 AS id
FROM
num n1
CROSS JOIN num AS n10
CROSS JOIN num AS n100
CROSS JOIN num AS n1000
CROSS JOIN num AS n10000
) AS numlist;
这里我用了100000条记录,算出来到2289年了,完全够用了,到那个时候,出问题,我也管不了了。
完成之后,请删除num的零时表
4、联合查询
SELECT
date(dday) ddate,
count(*) - 1 as num
FROM
(
SELECT
datelist as dday
FROM
calendar
-- 这里是限制返回最近30天的数据
where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(datelist)&&date(datelist)<=CURDATE()
UNION ALL
SELECT
downtime
FROM
re_device
) a
GROUP BY ddate
5、其他解决方法
当然,应该还有其他的解决方案,但是博主就没有去写了,有时间可以去写一下。
我用的spring mvc,所以,也还是可以在java代码中补充完整的,因为数据返回的是个map对象,那麽我们要遍历这个对象,直接用calendar对象,生成日期作为key来遍历,如果没有数据,就put进去一个0,然后在限制一下,需要多少天的,就可以了。数据就完整了。
但是这样也有一个问题,那就是map里的数据顺序会有问题,所以,使用的时候,也必须是生成calendar对象,然后构造出来日期作为key来遍历。或者用Collections.sort()排序一下。
我个人觉得,还是上数据直接生成得比较好一点。
Mysql按日期分组(group by)查询统计的时候,没有数据补0的解决办法的更多相关文章
- MySQL按日期分组并统计截止当前时间的总数(实例教程)
MySQL按日期分组并统计截止当前时间的总数 建表语句 SET NAMES utf8mb4; ; -- ---------------------------- -- Table structure ...
- HBase 高性能获取数据(多线程批量式解决办法) + MySQL和HBase性能测试比较
摘要: 在前篇博客里已经讲述了通过一个自定义 HBase Filter来获取数据的办法,在末尾指出此办法的性能是不能满足应用要求的,很显然对于如此成熟的HBase来说,高性能获取数据应该不是问题. ...
- mysql按日期分组统计数据
最近在做一个招聘网时,需要显示一个月内企业招聘信息的发布数量,按日期分组统计,刚开始是直接从源数据库表里面进行group by,但这样子就出现日期不连续的问题了,我想要的效果是,若当天没有数据,则显示 ...
- Mysql 分组查询出现'this is incompatible with sql_mode=only_full_group_by'的解决办法
由于Mysql自动开启了 only_full_group_by,所以若查询的字段不在group by里面,则分组报错. 解决办法其一:mysql配置,关闭only_full_group_by,这种办法 ...
- 报表统计——java实现查询某年某月每天数据,没数据补0
一般图表绘制例如echarts等,返回数据格式都大同小异.重点是利用sql或者java实现数据格式的转型,接下来是关键部分: 1.前提:提供的工具方法——获取某月有多少天 //通过年份和月份确定该月的 ...
- python3操作mysql数据库表01(封装查询单条、多条数据)
#!/usr/bin/env python# -*- coding:UTF-8 -*- import pymysql# import os'''封装查询单条.多条数据'''# os.environ[' ...
- MySQL:Error : Tablespace for table '`database`.`temp`' exists. Please DISCARD the tablespace before IMPORT.解决办法
今天在navicat上操作mysql数据库表,突然没有响应了.随后重启,mysql服务也终止了.随后启动服务,检查表,发现一张表卡没了,就重新添加一张表.报了一个错: Error : Tablespa ...
- [MySQL]在安装windows版MySQL时遇到过如下问题Error Nr.1045和Error.Nr.2003,相应解决办法如下
1.准备mysql server-5.0.27.exe 2.按照指导安装,在安装到最后一步时遇到如下两个错误: 2.1.出现错误Error Nr.1045 解决办法: a).停止MySQL服务:我的电 ...
- Navicat新建查询,系统找不到指定路径 独家解决办法
Navicat新建查询系统找不到指定路径,很多人用了网上流行的那些解决办法,还是无法解决.比如: https://jingyan.baidu.com/article/86112f1387a713273 ...
随机推荐
- Mysql 强行Kill 连接
BEGIN ; ; ; DO KILL @Temp; ; END WHILE ; END
- 基于Arcface Android平台的人脸识别实现
效果图 先上效果,让大家看看如何 现在有很多人脸识别的技术我们可以拿来使用:但是个人认为还是离线端的SDK比较实用:所以个人一直在搜集人脸识别的SDK:原来使用开源的OpenCV:最近有个好友推荐虹软 ...
- 学习笔记4-pathon的range()函数和list()函数
使用python的人都知道range()函数很方便,今天再用到他的时候发现了很多以前看到过但是忘记的细节.这里记录一下range(),复习下list的slide,最后分析一个好玩儿的冒泡程序. 这里记 ...
- DAY3 数据类型与运算符
一.注释 代码注释分单行和多行注释, 单行注释用#,多行注释可以用三对双引号""" """ 注释用于解释某一行代码的作用,增加代码的可读性 ...
- 加速cin的技巧
ios::sync_with_stdio(false); cin.tie(0); 把cin变得和scanf一样快.
- java 数据导入xls
@RequestMapping("admin/doorDesign/getexcel.do") public void getExcel(String name,String ph ...
- 修改TP5中common模块默认不能使用问题
在TP5框架中common模块是一个特殊的模块,默认是禁止直接访问的,一般用于放置一些公共的类库用于其他模块的继承.其实是可以访问common模块的, 只需要把convention.php文件中的 / ...
- JS中如何生成全局变量
JS中如何生成全局变量 一.总结 一句话总结:在函数内部,一般用var声明的为局部变量,没用var声明的一般为全局变量 在函数内没用var声明的一般为全局变量 1.js中的函数中的this指向的是谁? ...
- 2017-2018-2 20165303 实验二《Java面向对象程序设计》实验报告
实验一 实验要求 参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECUNITTEST 完成单元测试的学习 提交最后三个JUnit测试用例(正常情况, ...
- 集合 (set)
set 是一个无序不重复的元素集,集合跟字典是无序的,不支持索引 创建集合: 第一种方式:通过{ }创建 >>> num={1,2,3,4,3,3,1} >>> n ...