SQL按照日期分组查询

1. 按照天统计分组

--按照天统计3

select b.data_time,isnull(a.val,0) as val
from (
select convert(varchar(10),dateadd(DAY,number,'2018-08-01'),120)  as data_time
from master..spt_values where datediff(DAY,dateadd(day,number,'2018-08-01'), '2018-08-05')>0 and number>=0 and type='p') b
left join 
( select convert(nvarchar(10),data_time,120) as data_time,ISNULL(avg(val),0.0) as val  from tableName where data_time >='2018-08-01' and data_time < '2018-08-05'  group by convert(nvarchar(10),data_time,120)
) as a on a.data_time=b.data_time;

2.按照月统计分组

--按照月统计

select b.data_time,isnull(a.val,0) as val
from(
select convert(varchar(10),dateadd(MONTH,number,'2018-08-01'),120)  as data_time
from
    master..spt_values 
where 
    datediff(MONTH,dateadd(MONTH,number,'2018-08-01'), '2018-11-01')>0
    and number>=0 
    and type='p') b
left join 
( select datename(year,data_time)+ '-' + datename(MONTH,data_time)+'-01' as data_time ,ISNULL(avg(val),0.0) as val from  tableName  
  where data_time >='2018-08-01' and data_time < '2018-11-01'
  group by datename(year,data_time)+ '-' + datename(MONTH,data_time)+'-01'
) as a on a.data_time=b.data_time;

3.按照年统计分组

--按照年统计

select b.data_time,isnull(a.val,0) as val
from(
select convert(varchar(10),dateadd(year,number,'2017-01-01'),120)  as data_time
from master..spt_values 
where datediff(year,dateadd(year,number,'2017-01-01'), '2019-01-01')>0
    and number>=0 
    and type='p') b
left join 
( select datename(year,data_time)+ '-01-01' as data_time ,ISNULL(avg(val),0.0) as val from  tableName where data_time >='2017-01-01' and data_time < '2019-01-01'
  group by datename(year,data_time)+ '-01-01'
) as a on a.data_time=b.data_time

 

你可能感兴趣的:(数据库,SQL)