CREATE TABLE [test] (
[id] [bigint] IDENTITY (1, 1) NOT NULL ,
[Cdatetime] [datetime] NULL ,
[Cnum] [int] NULL ,
) ON [PRIMARY] 
insert into test 
select '2012-12-27',1 union all
select '2013-01-01',2 union all
select '2013-02-01',3 union all
select '2013-03-01', 4 union all
select '2013-04-01', 5 union all
select '2013-05-01', 6 
GO现在对测试数据进行按月份统计,统计条件:上月22号到本月23号为一个月(2012-12-27属于2013年1月范围,依此类推)
想得到这样的结果 月份     数量
1月份    3
2月份    3
3月份    4
4月份    5
5月份    6SQLselect测试统计

解决方案 »

  1.   

    SELECT  YEAR(cdatetime) AS '年' ,
            CONVERT(VARCHAR, MONTH(CASE WHEN DAY(cdatetime) > 23
                                        THEN DATEADD(mm, 1, cdatetime)
                                        ELSE cdatetime
                                   END)) + '月' AS 月份 ,
            SUM(cnum) AS 数量
    FROM    dbo.TEST
    GROUP BY YEAR(cdatetime) ,
            CONVERT(VARCHAR, MONTH(CASE WHEN DAY(cdatetime) > 23
                                        THEN DATEADD(mm, 1, cdatetime)
                                        ELSE cdatetime
                                   END)) + '月'
                                   
    /*年 月份 数量
    2012 1月 1
    2013 1月 2
    2013 2月 3
    2013 3月 4
    2013 4月 5
    2013 5月 6*/
      

  2.   

    SELECT  
            CONVERT(VARCHAR, MONTH(CASE WHEN DAY(cdatetime) > 23
                                        THEN DATEADD(mm, 1, cdatetime)
                                        ELSE cdatetime
                                   END)) + '月份' AS 月份 ,
            SUM(cnum) AS 数量
    FROM    dbo.TEST
    GROUP BY 
            CONVERT(VARCHAR, MONTH(CASE WHEN DAY(cdatetime) > 23
                                        THEN DATEADD(mm, 1, cdatetime)
                                        ELSE cdatetime
                                   END))
                                   
    /*月份 数量
    1月份 3
    2月份 3
    3月份 4
    4月份 5
    5月份 6*/