‘壹’ sql: 一般情况按年分组,特殊年份按指定日期分组,SELECT语句怎么写
如果只是一年的话还好说,如果是三四年那就麻烦了,但是如果每一年都要这样还反而简单了,最怕的就是某些特殊要求,那样不好写。
我写一个一年的,写一个全部的。
这是一年的,可能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)
其实是一样的,就是把原表改了一下,只是这两种情况是比较好改的,如果有三年或者四年是需要进行这样的分组,那就麻烦了。如果有这种情况,建议在表中加一个标示字段,那样就能简单一些了。
‘贰’ sql数据库怎么实现分组并取每组的前1条语句,按日期排序
select * from
(
select row_number() over(partition by '分组' order by '日期') as rownum -- 排序并分组
, * -- 所需显示的字段
from 表
) as T
where T.rownum = 1
对每组的数据按日期排序并加上行号
取出时只取行号为1,也就是第一条数据。
‘叁’ SQL把日期按月分类,汇总相关数据
不知道你是什么数据库,只能写个意思,具体的内容要你自己搞定。
其实就是把日期字段截取一下,如果日期本身没办法截取,那就转换一下。比如如果是oracle那么可以用to_char转换为字符型,然后再截取。如果担心1月和10月截取重复,那就多截取一位,或者查找第二个/字符的位置截取。
截取完成后,在用截取后的日期和客户分组,金额汇总求和就可以了。
我比较熟悉oracle,我用oracle的写法尝试这写一个,如果不是oracle,那么你就要自己找找类似的了。(日期也可以直接截取,不过好长时间没写忘记怎么写了,就写一个转换的吧)
select substr(to_char(日期),1,instr(to_char(日期),'/',1,2)-1) 月份,客户,sum(金额汇总) from table group by substr(to_char(日期),1,instr(to_char(日期),'/',1,2)-1) ,客户
‘肆’ sql 求和 按时间分组
select 单位,sum(case when 月份=1 then 金额 else 0 end) 金额(月份1),
sum(case when 月份=2 then 金额 else 0 end) 金额(月份2),
sum(case when 月份=3 then 金额 else 0 end) 金额(月份3)
from table1 group by 单位
‘伍’ SQL中怎样对datetime数据类型按日期分组
转换后如果日期列是datetime的话这样写:
select cast(convert(varchar(10),日期,120) as datetime),金额 from 表
转换后如果日期列为varchar型的话这样写:
select convert(varchar(10),日期,120),金额 from 表
以上,希望对你有所帮助!
‘陆’ sql语句按照日期分组怎么写
1.如果你的时间格式是2012-01-13 17:35:52.217这样的形式,(主要是那个01不要是1),用下面这个
SELECT convert(varchar(10),时间,23),SUM(数字数据) FROM 表
group by convert(varchar(10),时间,23)
2.如果你的时间格式不是上面的格式,先转化成datetime:
SELECT convert(varchar(10),cast(时间 as datetime),23) ,SUM(数字数据) FROM 表
group by convert(varchar(10),cast(时间 as datetime),23)
3.如果报错,请追问~
‘柒’ SQL按当天时间分组显示当天的所有记录
Oracle直接用sql就可以
select .... from table where to_date(to_char(field3,'YYYY-MM-DD'),'YYYY-MM-DD')=to_date(to_char(sysdate,'YYYY-MM-DD'),'YYYY-MM-DD') group by field3
‘捌’ SQL 按日期时间分组语句的写法
对,sql对DateTime类型数据操作时都会精确到毫秒,而用了CONVERT(varchar, in_date, 120)后会转换成yyyy-mm-dd hh:mi:ss(24小时制)格式
‘玖’ sqlserver如何根据日期进行分组查询
日期分组的概念,就是把日期所在的字段,转换为 一个人日期类型,然后group by
sqlserver日期分组相关知识
selectconvert(varchar,dateinfo,111)asa,sum(***)fromtableName
groupbyconvert(varchar,dateinfo,111)
请参阅,如有疑问,及时沟通!
谢谢!
‘拾’ SQL server 对日期每三天进行分组
1、首先需要一个能生成日期范围的表值函数
/*
生成一个日期范围,如2014.01、2014.02...
@Increment步进值
@StartDate开始日期
@EndDate结束日期
----------------------
@SelectedRange返回值名称(多语句表值函数的返回值必须存放在返回值变量中)
返回表的字段和类型:
iDateDATETIME,
iYearchar(4),
iMonthchar(2),
iYMCHAR(7)
*/
CREATEFUNCTION[dbo].[DateRange]
(
@Incrementchar(1)='m',
@StartDateDATE='20140101',
@EndDateDATE=null
)
RETURNS@SelectedRangeTABLE
(
iDateDATE,
iYearchar(4),
iMonthchar(2),
iYMCHAR(7)
)
AS
BEGIN
/*.
ThefunctionGETDATE(),soitisnotaconstantexpression.
*/
--IF@EndDateisnull
--SET@EndDate=getdate()
--or
SET@EndDate=Coalesce(@EndDate,GetDate())
;WITHcteRange(DateRange)AS
(
SELECTCAST(@StartDateASDATE)
UNIONALL
SELECT
CASE
WHEN@Increment='d'THENDATEADD(dd,1,DateRange)
WHEN@Increment='w'THENDATEADD(ww,1,DateRange)
WHEN@Increment='m'THENDATEADD(mm,1,DateRange)
END
FROMcteRange
WHEREDateRange<=
CASE
WHEN@Increment='d'THENDATEADD(dd,-1,@EndDate)
WHEN@Increment='w'THENDATEADD(ww,-1,@EndDate)
WHEN@Increment='m'THENDATEADD(mm,-1,@EndDate)
END
)
INSERTINTO@SelectedRange(iDate,iYear,iMonth,iYM)
SELECTDateRange,YEAR(DateRange)[Year],MONTH(DateRange)[Month],CONVERT(VARCHAR(7),DateRange,102)[YM]
FROMcteRange
OPTION(MAXRECURSION0);
RETURN
END
2、使用示例:
SELECT*FROMDateRange('d','2018-01-01','2018-06-01')
4、使用上面的查询去关联带值的表,然后进行SUM即可实现