MySQL时间段查询,无数据补0
上一节提到分时间段统计,可是无数据的时候不显示,而此时我们需要让他显示0。
首先我们需要建一个时间表。
CREATE TABLE `my_date` (
`date` date NOT NULL,
PRIMARY KEY (`date`)
)
并且插入一些数据,具体怎么插入有好多种方法,目的是生成我们需要的时间格式,如下

以下就要用到我们的时间表,与我们的数据表进行连接查询了。呃,中间的1你们可以忽略啊!!你们需要看的只有 t 和 count
mysql> select DATE_FORMAT(md.date,'%Y-%m') t,1,count(*) from my_date md left join article a on DATE_FORMAT(md.date,'%Y-%m') = DATE_FORMAT(a.article_time,'%Y-%m') group by t; +---------+---+----------+
| t | 1 | count(*) |
+---------+---+----------+
| 2015-01 | 1 | 1 |
| 2015-02 | 1 | 1 |
| 2015-03 | 1 | 1 |
| 2015-04 | 1 | 1 |
| 2015-05 | 1 | 1 |
| 2015-06 | 1 | 1 |
| 2015-07 | 1 | 1 |
| 2015-08 | 1 | 1 |
| 2015-09 | 1 | 1 |
| 2015-10 | 1 | 1 |
| 2015-11 | 1 | 1 |
| 2015-12 | 1 | 1 |
| 2016-01 | 1 | 1 |
| 2016-02 | 1 | 1 |
| 2016-03 | 1 | 1 |
| 2016-04 | 1 | 1 |
| 2016-05 | 1 | 1 |
| 2016-06 | 1 | 1 |
| 2016-07 | 1 | 1 |
| 2016-08 | 1 | 22 |
| 2016-09 | 1 | 26 |
| 2016-10 | 1 | 3 |
| 2016-11 | 1 | 1 |
| 2016-12 | 1 | 1 |
+---------+---+----------+
24 rows in set
这里出现了一个问题,无数据的字段变成1了,哈哈哈,什么鬼呀,神经病啊。注意,这里的count(*) 代表统计所有的行,你数据表的那一行无数据,可是我们进行left join 获得的一行不止数据表吧?还有时间表的,时间表那里不为空,是有数据的,所以变成了1。所以我们要把count(*) 变成 count(a.article_id)
mysql> select DATE_FORMAT(md.date,'%Y-%m') t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,'%Y-%m') = DATE_FORMAT(a.article_time,'%Y-%m') group by t;
+---------+---+---------------------+
| t | 1 | count(a.article_id) |
+---------+---+---------------------+
| 2015-01 | 1 | 0 |
| 2015-02 | 1 | 0 |
| 2015-03 | 1 | 0 |
| 2015-04 | 1 | 0 |
| 2015-05 | 1 | 0 |
| 2015-06 | 1 | 0 |
| 2015-07 | 1 | 0 |
| 2015-08 | 1 | 0 |
| 2015-09 | 1 | 0 |
| 2015-10 | 1 | 1 |
| 2015-11 | 1 | 0 |
| 2015-12 | 1 | 0 |
| 2016-01 | 1 | 0 |
| 2016-02 | 1 | 0 |
| 2016-03 | 1 | 0 |
| 2016-04 | 1 | 0 |
| 2016-05 | 1 | 0 |
| 2016-06 | 1 | 0 |
| 2016-07 | 1 | 1 |
| 2016-08 | 1 | 22 |
| 2016-09 | 1 | 26 |
| 2016-10 | 1 | 3 |
| 2016-11 | 1 | 1 |
| 2016-12 | 1 | 1 |
+---------+---+---------------------+
24 rows in set
到这里我们发现,时间表里面有多少时间就查出多少,如果我时间表里面有1亿个那还了得!所以我们要进行限制,比如要查当前年份的每个月数据。
mysql> select DATE_FORMAT(md.date,'%Y-%m') t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,'%Y-%m') = DATE_FORMAT(a.article_time,'%Y-%m') where DATE_FORMAT(md.date,'%Y') = DATE_FORMAT(curdate(),'%Y') group by t;
+---------+---+---------------------+
| t | 1 | count(a.article_id) |
+---------+---+---------------------+
| 2016-01 | 1 | 0 |
| 2016-02 | 1 | 0 |
| 2016-03 | 1 | 0 |
| 2016-04 | 1 | 0 |
| 2016-05 | 1 | 0 |
| 2016-06 | 1 | 0 |
| 2016-07 | 1 | 1 |
| 2016-08 | 1 | 22 |
| 2016-09 | 1 | 26 |
| 2016-10 | 1 | 3 |
| 2016-11 | 1 | 1 |
| 2016-12 | 1 | 1 |
+---------+---+---------------------+
12 rows in set
如果我们要指定年份呢
mysql> select DATE_FORMAT(md.date,'%Y-%m') t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,'%Y-%m') = DATE_FORMAT(a.article_time,'%Y-%m') where DATE_FORMAT(md.date,'%Y') = '' group by t;
+---------+---+---------------------+
| t | 1 | count(a.article_id) |
+---------+---+---------------------+
| 2015-01 | 1 | 0 |
| 2015-02 | 1 | 0 |
| 2015-03 | 1 | 0 |
| 2015-04 | 1 | 0 |
| 2015-05 | 1 | 0 |
| 2015-06 | 1 | 0 |
| 2015-07 | 1 | 0 |
| 2015-08 | 1 | 0 |
| 2015-09 | 1 | 0 |
| 2015-10 | 1 | 1 |
| 2015-11 | 1 | 0 |
| 2015-12 | 1 | 0 |
+---------+---+---------------------+
12 rows in set
那个时间表里面的数据一定要事先生成咯,生成个几十年就够用了,公司说不定活不到那个时候呢哈哈哈,好好笑
下面进行一下每年的统计,到这里我时间表加入了2014年的12个月
mysql> select DATE_FORMAT(md.date,'%Y') t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,'%Y-%m') = DATE_FORMAT(a.article_time,'%Y-%m') group by t;
+------+---+---------------------+
| t | 1 | count(a.article_id) |
+------+---+---------------------+
| 2014 | 1 | 0 |
| 2015 | 1 | 1 |
| 2016 | 1 | 54 |
+------+---+---------------------+
3 rows in set
这个呢,时间表里面有多少年就显示多少年,我们也可以指定、
mysql> select DATE_FORMAT(md.date,'%Y') t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,'%Y-%m') = DATE_FORMAT(a.article_time,'%Y-%m') where DATE_FORMAT(md.date,'%Y') > '' group by t;
+------+---+---------------------+
| t | 1 | count(a.article_id) |
+------+---+---------------------+
| 2015 | 1 | 1 |
| 2016 | 1 | 54 |
+------+---+---------------------+
2 rows in set
mysql> select DATE_FORMAT(md.date,'%Y') t,1,count(a.article_id) from my_date md left join article a on DATE_FORMAT(md.date,'%Y-%m') = DATE_FORMAT(a.article_time,'%Y-%m') where DATE_FORMAT(md.date,'%Y') > '' and DATE_FORMAT(md.date,'%Y') < '' group by t;
+------+---+---------------------+
| t | 1 | count(a.article_id) |
+------+---+---------------------+
| 2015 | 1 | 1 |
+------+---+---------------------+
1 row in set
MySQL时间段查询,无数据补0的更多相关文章
- SQL Server中时间段查询和数据类型转换
不知道什么时候对数据独有情种,也许是因为所学专业的缘故,也许是在多年的工作中的亲身经历,无数据,很多事情干不了,数据精度不够,也很多事情干不了,有一次跟一个朋友开玩笑说,如果在写论文的时候,能有一份独 ...
- MySQL如何查询LINESTRING数据
我有一个提交的命名crm_geo_org,具有以下结构 ipoid INTEGER 11 NOT NULL PRIMARY KEY beginip INTEGER 14 NOT NULL UNSIGN ...
- Mysql按日期分组(group by)查询统计的时候,没有数据补0的解决办法
转载自:http://blog.csdn.net/jie11447416/article/details/50887888 1.案例中的数据结构和数据如下 2.在没有解决的时候,是这样的 SELE ...
- 报表统计——java实现查询某年某月每天数据,没数据补0
一般图表绘制例如echarts等,返回数据格式都大同小异.重点是利用sql或者java实现数据格式的转型,接下来是关键部分: 1.前提:提供的工具方法——获取某月有多少天 //通过年份和月份确定该月的 ...
- 报表统计——java实现查询某年12个月数据,没数据补0
一般图表绘制例如echarts等,返回数据格式都大同小异.重点是利用sql或者java实现数据格式的转型,接下来是关键部分: 1.mapper层sql语句,返回统计好的月份与对应月份的数据. < ...
- MySQL时间段查询
现实中我们会遇到统计报表.比如查询当月每一天的数据数量...等等之类的.以下内容就是有关这方面的咯. 首先要知道几个函数 mysql> select now(); //这个是显示的当前时间 +- ...
- MySQL分页查询大数据量优化方法
方法1: 直接使用数据库提供的SQL语句 语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N适应场景: 适用于数据量较少的情况(元组百/千级)原因/缺点: ...
- mysql随机查询若干条数据
条不重复的数据,使用以下: 秒以上 搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据. SELECT * FROM `table` AS t1 JOIN (SELE ...
- 【MySQL】MySQL中查询出数据表中存在重复的值list
1.目的:查询MySQL数据表中,重复记录的值 2.示例: 3.代码: select serial_num,count(*) as count FROM card_ticket GROUP BY se ...
随机推荐
- [转]Linux学习笔记——例说makefile 头文件查找路径
0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助 ...
- IO口
STM32的每个IO端口都有7个寄存器来控制.他们是:CRH CRL IDR ODR BSRR BRR LCKR.我们常用的IO端口寄存器位CRL CRH IDR ODR.CRL CRH控制着每个IO ...
- Python 打包工具cx_freeze 问题记录及解决办法
在节前的最后一天,解决了打包过程中遇到的所有问题,可以成功运行了!真是个好彩头,希望新的一年一切顺利! 以下是在使用cx_freeze过程中遇到的问题及解决办法(Win7) 问题描述:运行exe,启动 ...
- 使用JMeter进行简单的压力测试
一.压力测试 顾名思义:压力测试,就是 被测试的系统,在一定的访问压力下,看程序运行是否稳定/服务器运行是否稳定(资源占用情况). 比如: 2000个用户同时到一个购物网站购物,这些用户打开页面的速 ...
- 早上遇到err_content_decoding_fail错误
网站在手机端出现一个error: err_content_decoding_fail. 查了一下,应该是文件编码出问题了. 但这两天都很小代码级别的改动,编码的问题一般都是会在覆盖文件的时候才出现. ...
- 通过代码自定义cell(cell的高度不一致)
- react 调用 native 的callShareAllFunc()方法,实现分享
let shareName = { '0': '微信', '1': '朋友圈', '2': '新浪微博', '3': ' QQ', '4': 'QQ空间'};render(){ //分享YztApp. ...
- Macaca开源--阿里的移动自动化测试框架
https://github.com/macacajs/macaca-cli 项目在此 https://macacajs.github.io/macaca/cli-usage.html 文档在此 项目 ...
- MFC Picture控件加载图片
CStatic *pPic = (CStatic*)GetDlgItem(IDC_PICTURE); CBitmap bitmap; bitmap.LoadBitmapW(IDB_BITMAP2); ...
- sed
命令行格式为: sed [-nefri] ‘command’ 输入文本/文件 常用选项: -n∶取消默认的输出,使用安静(silent)模式.在一般 sed 的用法中 ...