SQL: 一般情况按年分组,特殊年份按指定日期分组,SELECT语句怎么写?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL: 一般情况按年分组,特殊年份按指定日期分组,SELECT语句怎么写?相关的知识,希望对你有一定的参考价值。

表中有个字段为“日期”,如下:

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

请问可以实现吗?

我觉得,这种需求,应该分开来做,按照你的说法,第一次,将特殊年份去掉,只计算普通年份,第二次只计算特殊年份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程序里,再将三次的结果数据拼成最终想要的结果,应该更方便。
参考技术A 如果只是一年的话还好说,如果是三四年那就麻烦了,但是如果每一年都要这样还反而简单了,最怕的就是某些特殊要求,那样不好写。
我写一个一年的,写一个全部的。
这是一年的,可能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)
其实是一样的,就是把原表改了一下,只是这两种情况是比较好改的,如果有三年或者四年是需要进行这样的分组,那就麻烦了。如果有这种情况,建议在表中加一个标示字段,那样就能简单一些了。追问

谢谢耐心解答!所谓“特殊情况”是指当年因为机构改革之类原因需要分时间段处理的情况,目前看只有一年需要这样处理。我按你的例子改了下,效果是出来了,但汇总的结果不对,麻烦再看看。由于百度追问字数有限,具体代码私信发给你。万分感谢!

本回答被提问者和网友采纳
参考技术B select date_format(日期字段, '%Y') as year from table group by year order by year asc

date_format 函数学习一下
这样就可以格式化日期了,至于你要加的where条件,你自己加到where里面就好了

参考技术C 你好!
你这个表要是没有具体的日期字段的话,没办法统计的!
根本分不开哪些数据是51之前的,哪些是51之后的啊!
祝你好运吧!追问

谢谢回答,是我考虑不周。这个年份字段其实是个日期字段,我把问题改一下。

追答

你这个硬写可以写出来,但是灵活的话,暂时没想到什么好办法

追问

那就固定2017年按51前后,其他年份按年,麻烦写一个试试。谢啦

c# List<T> 按年分组,然后按月分组

【中文标题】c# List<T> 按年分组,然后按月分组【英文标题】:c# List<T> group by year then by month [duplicate] 【发布时间】:2015-09-18 23:14:17 【问题描述】:

我有一堂课:

public class Item

    public string ItemId  get; set; 
    public DateTime Created  get; set; 
    public string Title  get; set; 

如果我有一个列表,我如何按年和月对项目进行分组?

当然一年会是这样的:

list.GroupBy(t=>t.Created.Year);

【问题讨论】:

您能举例说明您期望最终结果的样子吗? 【参考方案1】:
 list.GroupBy(t => new  Year = t.Created.Year, Month = t.Created.Month );

【讨论】:

以上是关于SQL: 一般情况按年分组,特殊年份按指定日期分组,SELECT语句怎么写?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据按年份分组并按日期排序

SQL 按年份分组给出不正确的结果

按年季度月分组&&计算日期和时间的函数

如何在oracle sql developer中按年和月分组获取当前财政年度的数据?

我需要一些关于 SQL Sum 函数按日期和组分组的帮助

Linq to sql,聚合列,按日期分组到列表视图