系统:sql server 2005.
我准备写一个按月份和年份统计汇总销售数量的存储过程,销售表T_Sale的字段为:
1.销售日期(类型:datetime),名称Sale_rq
2.销售数量,名称Sale_sl
销售日期是可以跨好几年的,所以要先求出现在销售表T_Sale的Sale_rq的最小值和最大值(比如最小值2005-04-06,最大值2010-04-20)
我的求助是:
1.如何把2005-04-06~2010-04-20内的销售数量按月份统计。
2.如何把2005-04-06~2010-04-20内的销售数量按年份统计。
请写出相应的SQL语句。

解决方案 »

  1.   

    select convert(varchar(7),Sale_rq,120) 月份 , sum(Sale_sl) 销售数量 from T_Sale where Sale_rq between '2005-04-06' and '2010-04-20' group by convert(varchar(7),Sale_rq,120)select year(Sale_rq) 年份 , sum(Sale_sl) 销售数量 from T_Sale where Sale_rq between '2005-04-06' and '2010-04-20' group by year(Sale_rq)
      

  2.   


    --如果你需要存储过程,则如下,把时间做为参数传进去。create procedure my_proc @dt1 datetime,@dt2 datetime
    as
    begin  select convert(varchar(7),Sale_rq,120) 月份 , sum(Sale_sl) 销售数量 from T_Sale where Sale_rq between @dt1 and @dt2 group by convert(varchar(7),Sale_rq,120)  select year(Sale_rq) 年份 , sum(Sale_sl) 销售数量 from T_Sale where Sale_rq between @dt1 and @dt2 group by year(Sale_rq)
      
    end
    goexec my_proc '2005-04-06' , '2010-04-20' 
      

  3.   

    先用where条件过滤 日期  然后根据 月或者年 进行分组统计
    一楼正解
      

  4.   

    --月份:
    select convert(char(7),Sale_rq,23) 月份,sum(Sale_sl) 销售数量 
    from T_Sale 
    where Sale_rq between '2005-04-06' and '2010-04-20' 
    group by convert(char(7),Sale_rq,23)
    --年份:
    select year(Sale_rq) 年份,sum(Sale_sl) 销售数量 
    from T_Sale 
    where Sale_rq between '2005-04-06' and '2010-04-20' 
    group by year(Sale_rq)
      

  5.   

    获取月份
    select convert(varchar(7),getdate(),120)/*
            
    ------- 
    2010-04(所影响的行数为 1 行)*/
      

  6.   

    select MONTH(Sale_rq) 年份 , sum(Sale_sl) 销售数量 from T_Sale where Sale_rq between '2005-04-06' and '2010-04-20' group by MONTH(Sale_rq)
    select year(Sale_rq) 年份 , sum(Sale_sl) 销售数量 from T_Sale where Sale_rq between '2005-04-06' and '2010-04-20' group by year(Sale_rq)
    不知道行不???
      

  7.   


    create table #t
    (sale_rq   datetime,
     sale_sl   int default 0
    )
    insert into #t
    select '20050101',100
    union all select '20050201',100
    union all select  '20050301',100
    union all select  '20050401',100
    union all select  '20060401',100
    union all select  '20060501',100
    union all select  '20060801',100
    union all select  '20070801',100
    union all select  '20070901',100
    union all select  '20080901',100Select  Case When (Grouping(convert(varchar(4),Sale_rq,120))=1) Then '总计'  Else Isnull(convert(varchar(4),Sale_rq,120), '总计')  End As 年度,        
            Case When (Grouping(convert(varchar(2),month(Sale_rq),0))=1) Then '小计'  Else Isnull(convert(varchar(2),month(Sale_rq),0), '小计')  End As 月份, 
            SUM(Sale_sl)  销售数量
       from #t 
       where Sale_rq between '2005-04-06' and '2010-04-20' group by convert(varchar(4),Sale_rq,120),convert(varchar(2),month(Sale_rq),0)   with  rollupdrop  table #t--结果没细看
    2006 4 100
    2006 5 100
    2006 8 100
    2006 小计 300
    2007 8 100
    2007 9 100
    2007 小计 200
    2008 9 100
    2008 小计 100
    总计 小计 600
      

  8.   

    我试了一下,高手的,果然好使
    select convert(varchar(7),Sale_rq,120) 月份 , sum(Sale_sl) 销售数量 
    from T_Sale where Sale_rq 
    between (select min(Sale_rq) from t_sale) and (select max(Sale_rq) from t_sale)
    group by convert(varchar(7),Sale_rq,120)select year(Sale_rq) 年, sum(Sale_sl) 销售数量 from T_Sale where 
    Sale_rq between (select min(Sale_rq) from t_sale) and (select max(Sale_rq) from t_sale)
    group by  year(Sale_rq)
    多谢了,各位,来着都有分