SQL: 一般情况按年分组,特殊年份按指定日期分组,SELECT语句怎么写?
表中有个字段为“日期”,如下:日期-------2016-3-172016-5-222017-1-92017-7-82018-5-3…我知道,按年份分组统计,语句是这样的...
表中有个字段为“日期”,如下:
日期
-------
2016-3-17
2016-5-22
2017-1-9
2017-7-8
2018-5-3
…
我知道,按年份分组统计,语句是这样的:
SELECT Year(日期) AS 年份, ……, COUNT(*)
FROM 表名
……
GROUP Year(日期)
现在的需求是,一般的年份,还是跟上面一样按年份分组统计,如果 年份=2017 ,就要分别统计“2017-05-01以前” 和 “2017-05-01至年底”两个期间的数据。
请问可以实现吗? 展开
日期
-------
2016-3-17
2016-5-22
2017-1-9
2017-7-8
2018-5-3
…
我知道,按年份分组统计,语句是这样的:
SELECT Year(日期) AS 年份, ……, COUNT(*)
FROM 表名
……
GROUP Year(日期)
现在的需求是,一般的年份,还是跟上面一样按年份分组统计,如果 年份=2017 ,就要分别统计“2017-05-01以前” 和 “2017-05-01至年底”两个期间的数据。
请问可以实现吗? 展开
4个回答
展开全部
我觉得,这种需求,应该分开来做,按照你的说法,第一次,将特殊年份去掉,只计算普通年份,第二次只计算特殊年份5月1日以前的,第三次计算特殊年份5月1日以后的。
比如,数据从2001年至2019年都有,其中2015,2017,2019年为特殊年。则第一次不计算这三个年份。
1.select substr(year,1,4),count(1) from table where substr(year,1,4)!=2015 and substr(year,1,4)!=2017 and substr(year,1,4)!=2019 goup by substr(year,1,4)
第二次只计算特殊年份的,这里,看你的数据,提个建议,在保存日期数据时,格式尽量是yyyy-mm-dd型的,否则就会出现你现在的情况,怎么截取5月1日以前?还得写个小算法计算。这里按你yyyy-mm-dd的格式写sql了。特殊年份
2.select substr(year,6,2),count(1) from table where (substr(year,1,4)==2015 or substr(year,1,4)==2017 or substr(year,1,4)==2019) and substr(year,6,2)小于等于'05' goup by substr(year,1,4)
百度知道不让输入特殊字符,你写的时候自己换吧。
第三次就是把第二次小于等于换了就行。不知道你这个数据,是领导临时要统计的?还是用程序写的报表的代码,比较复杂的逻辑关系,尽量不要用数据库的方式单独处理,我提出的分三次获取数据,然后再java程序里,再将三次的结果数据拼成最终想要的结果,应该更方便。
比如,数据从2001年至2019年都有,其中2015,2017,2019年为特殊年。则第一次不计算这三个年份。
1.select substr(year,1,4),count(1) from table where substr(year,1,4)!=2015 and substr(year,1,4)!=2017 and substr(year,1,4)!=2019 goup by substr(year,1,4)
第二次只计算特殊年份的,这里,看你的数据,提个建议,在保存日期数据时,格式尽量是yyyy-mm-dd型的,否则就会出现你现在的情况,怎么截取5月1日以前?还得写个小算法计算。这里按你yyyy-mm-dd的格式写sql了。特殊年份
2.select substr(year,6,2),count(1) from table where (substr(year,1,4)==2015 or substr(year,1,4)==2017 or substr(year,1,4)==2019) and substr(year,6,2)小于等于'05' goup by substr(year,1,4)
百度知道不让输入特殊字符,你写的时候自己换吧。
第三次就是把第二次小于等于换了就行。不知道你这个数据,是领导临时要统计的?还是用程序写的报表的代码,比较复杂的逻辑关系,尽量不要用数据库的方式单独处理,我提出的分三次获取数据,然后再java程序里,再将三次的结果数据拼成最终想要的结果,应该更方便。
展开全部
如果只是一年的话还好说,如果是三四年那就麻烦了,但是如果每一年都要这样还反而简单了,最怕的就是某些特殊要求,那样不好写。
我写一个一年的,写一个全部的。
这是一年的,可能casewhen不能这么直接放在groupby的后面,那么可以先这么改造一下表,然后外面在套一层select就可以实现了。
select case when year(日期)=2017 and month(日期)<5 then '2017-05-01以前'
when year(日期)=2017 and month(日期)>4 then '2017-05-01至年底' else year(日期) end
年份,count(*) from table group by
(case when year(日期)=2017 and month(日期)<5 then '2017-05-01以前'
when year(日期)=2017 and month(日期)>4 then '2017-05-01至年底' else year(日期) end)
全部的
select concat(year(日期),case when month(日期)<5 then 1 else 2 end) 组合字段,count(*) from table group by concat(year(日期),case when month(日期)<5 then 1 else 2 end)
其实是一样的,就是把原表改了一下,只是这两种情况是比较好改的,如果有三年或者四年是需要进行这样的分组,那就麻烦了。如果有这种情况,建议在表中加一个标示字段,那样就能简单一些了。
我写一个一年的,写一个全部的。
这是一年的,可能casewhen不能这么直接放在groupby的后面,那么可以先这么改造一下表,然后外面在套一层select就可以实现了。
select case when year(日期)=2017 and month(日期)<5 then '2017-05-01以前'
when year(日期)=2017 and month(日期)>4 then '2017-05-01至年底' else year(日期) end
年份,count(*) from table group by
(case when year(日期)=2017 and month(日期)<5 then '2017-05-01以前'
when year(日期)=2017 and month(日期)>4 then '2017-05-01至年底' else year(日期) end)
全部的
select concat(year(日期),case when month(日期)<5 then 1 else 2 end) 组合字段,count(*) from table group by concat(year(日期),case when month(日期)<5 then 1 else 2 end)
其实是一样的,就是把原表改了一下,只是这两种情况是比较好改的,如果有三年或者四年是需要进行这样的分组,那就麻烦了。如果有这种情况,建议在表中加一个标示字段,那样就能简单一些了。
追问
谢谢耐心解答!所谓“特殊情况”是指当年因为机构改革之类原因需要分时间段处理的情况,目前看只有一年需要这样处理。我按你的例子改了下,效果是出来了,但汇总的结果不对,麻烦再看看。由于百度追问字数有限,具体代码私信发给你。万分感谢!
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2019-04-30
展开全部
select date_format(日期字段, '%Y') as year from table group by year order by year asc
date_format 函数学习一下
这样就可以格式化日期了,至于你要加的where条件,你自己加到where里面就好了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你好!
你这个表要是没有具体的日期字段的话,没办法统计的!
根本分不开哪些数据是51之前的,哪些是51之后的啊!
祝你好运吧!
你这个表要是没有具体的日期字段的话,没办法统计的!
根本分不开哪些数据是51之前的,哪些是51之后的啊!
祝你好运吧!
更多追问追答
追问
谢谢回答,是我考虑不周。这个年份字段其实是个日期字段,我把问题改一下。
追答
你这个硬写可以写出来,但是灵活的话,暂时没想到什么好办法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询