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至年底”两个期间的数据。

请问可以实现吗?
展开
 我来答
fuyh16
2019-05-01 · TA获得超过222个赞
知道小有建树答主
回答量:462
采纳率:82%
帮助的人:118万
展开全部
我觉得,这种需求,应该分开来做,按照你的说法,第一次,将特殊年份去掉,只计算普通年份,第二次只计算特殊年份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程序里,再将三次的结果数据拼成最终想要的结果,应该更方便。
longrenyingdc8ecb1
2019-04-30 · TA获得超过1万个赞
知道大有可为答主
回答量:6032
采纳率:82%
帮助的人:2352万
展开全部
如果只是一年的话还好说,如果是三四年那就麻烦了,但是如果每一年都要这样还反而简单了,最怕的竖弊就是某些特殊要颤握求,那样不好写。
我写一个一年的,写一个全部的。
这茄纤庆是一年的,可能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里面就好了

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
俺不想跟说话
2019-04-28 · TA获得超过678个赞
知道大有可为答主
回答量:3787
采纳率:100%
帮助的人:264万
展开全部
你好!
你这个表要是没有具体的日期字段的话,没办法统计伏弯的!
根本分不蔽枝开哪些缺并闷数据是51之前的,哪些是51之后的啊!
祝你好运吧!
更多追问追答
追问
谢谢回答,是我考虑不周。这个年份字段其实是个日期字段,我把问题改一下。
追答
你这个硬写可以写出来,但是灵活的话,暂时没想到什么好办法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式