重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
数据表中不存在的月份也要显示,建议创建一个从1到12月份的表作为比对表。如果不方便创建月份比对表则可以用select 1到12的办法来虚拟这个月份比对表,但是语句会有些冗长。请参考下列写法:
成都创新互联公司主要从事成都网站制作、成都做网站、网页设计、企业做网站、公司建网站等业务。立足成都服务辽中,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575
select months.year,months.month,
concat(ifnull(t.sumMonthNum,'0'),
'/',months.sumYearNum) as `月/年比`
from
(select * from
(select year(time) as year,
sum(num) as sumYearNum
from abc group by year(time)) years,
(select 1 as month 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 union all
select 10 union all
select 11 union all
select 12) months) months left join
(select year(time) as year,
month(time) as month,
sum(num) as sumMonthNum
from abc group by year(time),month(time)) t
on months.month=t.month
order by months.year,months.month;
实验截图如下:
源表数据
SQL代码及运行结果
比较简单直接一点的方法就是判断这个月份是不是1、4、7、10这4个月份的有一个,如果是,就是季度的第一个月。
判断条件是
if 月份 in (1,4,7,10) then 实现。
如果你是想判断月份是哪个季度的第一个月,用case when语句也就可以实现了
第一种方法用left join, 把月份显示出来,没有相应月份的时候,也会显示月份对应的列,但是值为空
第二种方法用临时表,建立2个字段,一个字段用来标注月份,另外一个字段标注统计值,先把12个月全部写进去,然后用指针对12个月进行统计,把结果填入到对应月份的统计结果中,如果为空就填0
在统计数据的需求中很容易出现按照天来统计数据的场景,有时某一列的维度在那天并没有产生数据,但是又没有一列是可以确保每天都是有数据的,由于mysql中并没有fulljoin这样的关联方式,在这种情况下关联查询就有些费劲,解决的办法也是多种多样,毕竟条条大路通罗马嘛,其他的就不说了,这里介绍一种相对方便的方法。
产生一个足够长的时间列,这个列要能够包含想要统计的所有日期。这个思路的实现很泛,可以创建一个日期的临时表,然后将想要查的日期插入,抛开创建表比较麻烦之外,一般在职能比较完善的公司,生产环境创建表或者修改数据是需要交给专门的DBA去操作的,各种流程。。。相对这个较简单的一种方式就是创建存储过程,然后产生时间列,这也是一种解决办法。
我的思路是先定义一个时间变量并初始化,然后和某个数据足够多的表关联查询获取时间列,这个表一般选取某张要查的表即可,数据条数只要超过需要查询的条数即可,足够即可,太多就是浪费,降低查询效率。
比如说我要查询2018-01-10到2018-01-20每天的数据,那么就可以写成
其中,cdate是我定义的一个时间变量,初始化的值是2018-01-09,因为在外面那部分执行之后值已经加1了,已经不是2018-01-10了;data_t是我关联产生记录的实体表,这个表只有一个要求,就是能帮我们产生足够的时间列条数,后面的limit 15是帮助我产生15条时间记录,可以换成其他条件;生成的t0其实就是15条全为2018-01-09的记录,外面的查询在每扫描一条t0的记录就会加1天,这样就会产生连续的时间列;WHERE后面是最终查询的截止条件,换成其他的也可以。
关联其他表举例:
查询从2018-01-10到当前日期每天的统计数据
通过上面的例子我想大部分人应该可以灵活变化了,比如查询多少天内每天的统计数据,某几个月内每月的统计数据等等,通过修改上面给的例子里面的sql完全可以做到,可以说这种思路就是个‘万能模板’,希望本文能够帮到大家。
里上图 表 aaa, 要按月份查找,a 出现的次数,代码如下
SELECT
CAST(YEAR(rq) as varchar) + '-' + CAST(MONTH(rq) as varchar) AS date,
count(*) AS '次数'
FROM aaa
where a="a"
GROUP BY
CAST(YEAR(rq) as varchar) + '-' + CAST(MONTH(rq) as varchar);
结果如下图,看看是不是你要的
select DATE_FORMAT(来电时间,'%Y-%m') as 月, 问题类别 , count(1) as 数量 from
( select 来电时间, 问题类别 from mytable where 问题类别 = '农村用水投诉' ) tmptable
group by DATE_FORMAT(来电时间,'%Y-%m') ,问题类别 ORDER BY 月 ASC;