zoukankan      html  css  js  c++  java
  • SQLSERVER中按年月分组

    SQLSERVER中按年月分组

    一个表有三个字段id,dt,d  分别存放id,时间,数值  
    id    dt    d 
    1 2004-08-11 12:12:00.000 9  
    2 2005-09-11 12:08:00.000 2  
    3 2005-08-11 12:12:00.000 6  
    4 2005-09-11 12:12:00.000 10  
    5 2005-08-11 12:12:00.000 0  
    要求按照时间里的月份分组求d字段和

    复制代码
     1 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[abc]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
     2 drop table [dbo].[abc] 
     3 GO 
     4  
     5 CREATE TABLE [dbo].[abc] ( 
     6     [id] [int] NOT NULL , 
     7     [dt] [datetime] NULL , 
     8     [d] [int] NULL  
     9 ) ON [PRIMARY] 
    10 GO  
    11  
    12 insert into abc (id,dt,d) values(1,'2004-08-11 12:12:00',9) 
    13 insert into abc (id,dt,d) values(2,'2005-09-11 12:8:00',2) 
    14 insert into abc (id,dt,d) values(3,'2005-08-11 12:12:00',6) 
    15 insert into abc (id,dt,d) values(4,'2005-09-11 12:12:00',10) 
    16 insert into abc (id,dt,d) values(5,'2005-08-11 12:12:00',0) 
    17 insert into abc (id,dt,d) values(6,'2004-11-2 12:12:00',4)
    18 insert into abc (id,dt,d) values(7,'2004-11-10 12:12:00',4)
    19 insert into abc (id,dt,d) values(8,'2004-11-30 12:12:00',4)
    20  
    21 select * from abc 
    22 select datepart(month,dt)as 月份,sum(d) as 合计  from abc group by datepart(month,dt)
    复制代码

    其实就用了一个DATEPART函数 
    引申一下:如果统计1,2,3,4,5,6,7,8,9,10,11月上旬,11月中下旬,12月的怎么办?
    可以这样:

    复制代码
    1 select case datepart(month,dt)
    2 when 11 then case sign(datepart(day,dt)-11) when -1 then 11 else 13 end
    3 else datepart(month,dt) end as 月份,
    4 sum(d) as 统计 
    5 from abc group by 
    6 case datepart(month,dt)
    7 when 11 then case sign(datepart(day,dt)-11) when -1 then 11 else 13 end
    8 else datepart(month,dt) end
    复制代码

    再引申,如果统计把年月作为分组统计的依据可以这样:

    1 select datename(year,dt)+datename(month,dt)as 年月 ,sum(d) as 统计 from abc group by datename(year,dt)+datename(month,dt)

    最后,明白group by 后面不仅可以跟字段名就可以了。

    再问再续:
    1、按照旬统计

    1 select case (datepart(day,dt)-1)/10 when 0 then '上旬' when 1 then '中旬' else '下旬' end as 旬,
    2 sum(d) as 统计 
    3 from abc group by 
    4 case (datepart(day,dt)-1)/10 when 0 then '上旬' when 1 then '中旬' else '下旬' end 

    2、按 年+旬 分组统计

    1 select datename(year,dt)+datename(month,dt)+case (datepart(day,dt)-1)/10 when 0 then '上旬' when 1 then '中旬' else '下旬' end as 日期, sum(d) as 统计
    2 from abc 
    3 group by datename(year,dt)+datename(month,dt)+case (datepart(day,dt)-1)/10 when 0 then '上旬' when 1 then '中旬' else '下旬' end 
  • 相关阅读:
    DOM总结
    BOM总结
    备忘录设计模式
    策略模式
    迭代器模式
    观察者模式
    装饰模式
    脚本工具(获取某个文件夹下的所有图片属性批量生成css样式)
    ajax传输中文乱码解决方法
    java Serialization and Deserializaton
  • 原文地址:https://www.cnblogs.com/dwuge/p/5382550.html
Copyright © 2011-2022 走看看