原文地址: http://www.cnblogs.com/LUA123/p/6155414.html

上一节提到分时间段统计,可是无数据的时候不显示,而此时我们需要让他显示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') = '2015' 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') > '2014' 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') > '2014' and DATE_FORMAT(md.date,'%Y') < '2016' group by t; +------+---+---------------------+ | t | 1 | count(a.article_id) | +------+---+---------------------+ | 2015 | 1 | 1 | +------+---+---------------------+ 1 row in set

MySQL时间段查询,无数据补0相关推荐

  1. mysql统计分析,无数据补0

    如题 这个分两种情况: 不需要补0 -- 查询最近七天工单 select date_format(createTime,"%Y-%m-%d") as days,count(*) a ...

  2. mysql 怎么查询结果补0_mysql查询连续时间数据——无数据补0

    用D3来画统计图,数据是从mysql数据库中查出来的.mysql 统计图是关于某段时间内,每一年/每个月/每周的微博数量的折线图.数据表是一条微博为一条记录,每条记录有日期这个字段.sql 首先考虑用 ...

  3. mysql查询补齐12个月_MySQL查询12个月数据,无数据补0

    1.数据库  和表就用自己的,下面是代码 select case month(shi_com_time) when '1' then sum(mileage) else 0 end as 一月份, c ...

  4. MySQL查询近12个月数据,无则补0

    查询近12个月数据,无则补0 select v.month,ifnull(b.count,0) count from (SELECT DATE_FORMAT(CURDATE(), '%Y-%m') A ...

  5. es统计mysql 报表_Elasticsearch(简称ES)实现日报表、月报表、年报表统计,没数据补0...

    前言: 这是1张相对简单些报表示例,用sql语句也能实现,但主要是为了便于大家理解ES聚合实现报表的使用方法. 之前写过"java实现日报表.月报表统计,没数据补0"文章,http ...

  6. java实现日报表、月报表统计,没数据补0

    产品需求: 1.日报表 2.月报表 需求点: 前端传日期或月份区间,当数据库中指定的日期或月份没数据时也需要界面显示,但领取人数和使用人数需要自动补齐0: 举例:2020-11-28.2020-11- ...

  7. Elasticsearch(简称ES)实现日报表、月报表、年报表统计,没数据补0

    前言: 这是1张相对简单些报表示例,用sql语句也能实现,但主要是为了便于大家理解ES聚合实现报表的使用方法. 之前写过"java实现日报表.月报表统计,没数据补0"文章,http ...

  8. mysql 获取下一条记录数,如何在MySQL中查询当前数据上一条和下一条的记录

    如果ID是主键或者有索引,可以直接查找: 方法一: 查询上一条记录的SQL语句(如果有其他的查询条件记得加上other_conditions以免出现不必要的错误): select * from tab ...

  9. MySQL数据库查询重复数据办法

    MySQL数据库查询重复数据办法 只操作一个列数据找出重复 select * from table1 where v1 = X group by column1 having count(*)> ...

最新文章

  1. 第八周实践项目10 稀疏矩阵的十字链表表示
  2. 设计模式之_Strategy_05
  3. 【2】开发环境的搭建,Ubuntu14.04
  4. 最新!兰州大学发布对上海市的新冠肺炎疫情预测!
  5. Java中的异常处理机制的简单原理和应用
  6. windows 串口中断编程_万变不离其宗之单片机串口共性问题
  7. 非名校毕业,如何在六天面试六家顶尖科技公司,并拿到全部Offer?
  8. HDOJ-1201 18岁生日
  9. 【手写字母识别】基于matlab GUI模板匹配手写大写字母识别【含Matlab源码 115期】
  10. 第八章:加载Maya2011模型
  11. 感谢《蜗居》中的100句经典台词让我们提前认清了现实[转帖]
  12. CentOS7快速配置服务器网卡聚合双bond方法
  13. 易经学习:第一卦 乾卦
  14. 聊聊什么是自动化测试,什么是自动化测试框架
  15. 经典英文歌曲,爆好听!
  16. 【React】配置 Alias 别名
  17. python之json数据库
  18. TIA PORTAL 导出导入数据块
  19. 要大进步就不能两手抓
  20. 软件安全性测试设计的基本原则

热门文章

  1. python实用库_python常用库
  2. 连接oracle数据库代码,oracle数据库的连接代码
  3. sqlite journal恢复数据_数据库是咋工作的?
  4. 什么是Reconciliation?
  5. 为什么 a==true 和 a==false 结果都是false ?
  6. 工作占用了太多私人时间_一本正经聊驾驶 | 汽车真的为我们节约时间了吗
  7. python语言中的缩进是什么意思_python编程中的缩进是什么意思
  8. java的开发环境日蚀日_将依赖项添加到后未解析geotools的导入pom.xml文件在日蚀中...
  9. codesys中打开linux端的串口_干货分享——安卓串口通信
  10. 站长吧asp工具设置_网站更换域名需要怎么办?网站更换域名如何设置?