create table tb(时间 datetime,类别 varchar(10),数量 int)
insert into tb values('2007-10-11','Au1',100)
insert into tb values('2007-10-11','Au2',200)
insert into tb values('2007-10-11','Au3',300)
insert into tb values('2007-10-11','Au4',400)
insert into tb values('2007-11-11','Au1',200)
insert into tb values('2007-11-11','Au2',200)
insert into tb values('2007-11-11','Au3',200)
insert into tb values('2007-11-11','Au4',300)
go
declare @y as int
set @y = 2007--静态SQL,指类型只有Au1,Au2,Au3,Au4四种.
select convert(varchar(7),时间,120) 时间,
  sum(case 类别 when 'Au1' then 数量 else 0 end) Au1,
  sum(case 类别 when 'Au2' then 数量 else 0 end) Au2,
  sum(case 类别 when 'Au3' then 数量 else 0 end) Au3,
  sum(case 类别 when 'Au4' then 数量 else 0 end) Au4,
  sum(数量) 合计
from tb
where datepart(year,时间) = @y
group by convert(varchar(7),时间,120)
union all
select convert(varchar(4),时间,120) 时间,
  sum(case 类别 when 'Au1' then 数量 else 0 end) Au1,
  sum(case 类别 when 'Au2' then 数量 else 0 end) Au2,
  sum(case 类别 when 'Au3' then 数量 else 0 end) Au3,
  sum(case 类别 when 'Au4' then 数量 else 0 end) Au4,
  sum(数量) 合计
from tb
where datepart(year,时间) = @y
group by convert(varchar(4),时间,120)
/*
时间             Au1         Au2         Au3         Au4         合计          
-------      ----------- ----------- ----------- ----------- ----------- 
2007-10        100         200         300         400         1000
2007-11        200         200         200         300         900
(10至11合计)    300         400         500         700         1900
*/
如果12个月都有数据的话,我想用个时间来控制,比如输入2007-08,就计算出2007-01到2007-08的数据的合计,最后是这种效果
时间             Au1         Au2         Au3         Au4         合计          
-------      ----------- ----------- ----------- ----------- ----------- (10至11合计)    300         400         500         700         1900
一条数据,请各位帮帮忙!

解决方案 »

  1.   

    create   table   tb(时间   datetime,类别   varchar(10),数量   int) 
    insert   into   tb   values( '2007-10-11 ', 'Au1 ',100) 
    insert   into   tb   values( '2007-10-11 ', 'Au2 ',200) 
    insert   into   tb   values( '2007-10-11 ', 'Au3 ',300) 
    insert   into   tb   values( '2007-10-11 ', 'Au4 ',400) 
    insert   into   tb   values( '2007-11-11 ', 'Au1 ',200) 
    insert   into   tb   values( '2007-11-11 ', 'Au2 ',200) 
    insert   into   tb   values( '2007-11-11 ', 'Au3 ',200) 
    insert   into   tb   values( '2007-11-11 ', 'Au4 ',300) 
    go 
    declare   @y1   as   varchar(7)
    set   @y1   =   '2007-08'
    declare @y2 as varchar(7)
    set   @y2   =   left(@y1,5) + '01'
     --静态SQL,指类型只有Au1,Au2,Au3,Au4四种. 
    select   convert(varchar(7),时间,120)   时间, 
        sum(case   类别   when   'Au1 '   then   数量   else   0   end)   Au1, 
        sum(case   类别   when   'Au2 '   then   数量   else   0   end)   Au2, 
        sum(case   类别   when   'Au3 '   then   数量   else   0   end)   Au3, 
        sum(case   类别   when   'Au4 '   then   数量   else   0   end)   Au4, 
        sum(数量)   合计 
    from   tb 
    where   convert(varchar(7),时间,120) between @y2 and @y1 
    group   by   convert(varchar(7),时间,120) 
    union   all 
    select   convert(varchar(4),时间,120)   时间, 
        sum(case   类别   when   'Au1 '   then   数量   else   0   end)   Au1, 
        sum(case   类别   when   'Au2 '   then   数量   else   0   end)   Au2, 
        sum(case   类别   when   'Au3 '   then   数量   else   0   end)   Au3, 
        sum(case   类别   when   'Au4 '   then   数量   else   0   end)   Au4, 
        sum(数量)   合计 
    from   tb 
    where   convert(varchar(7),时间,120) between @y2 and @y1
    group   by   convert(varchar(4),时间,120) 
    /* 
    时间      Au1         Au2         Au3         Au4         合计          
    ------- ----------- ----------- ----------- ----------- ----------- (所影响的行数为 0 行)
    */ 
      

  2.   

    --或者只使用一个参数@y1,不要@y2
    create   table   tb(时间   datetime,类别   varchar(10),数量   int) 
    insert   into   tb   values( '2007-10-11 ', 'Au1 ',100) 
    insert   into   tb   values( '2007-10-11 ', 'Au2 ',200) 
    insert   into   tb   values( '2007-10-11 ', 'Au3 ',300) 
    insert   into   tb   values( '2007-10-11 ', 'Au4 ',400) 
    insert   into   tb   values( '2007-11-11 ', 'Au1 ',200) 
    insert   into   tb   values( '2007-11-11 ', 'Au2 ',200) 
    insert   into   tb   values( '2007-11-11 ', 'Au3 ',200) 
    insert   into   tb   values( '2007-11-11 ', 'Au4 ',300) 
    go 
    declare   @y1   as   varchar(7)
    set   @y1   =   '2007-08'--静态SQL,指类型只有Au1,Au2,Au3,Au4四种. 
    select   convert(varchar(7),时间,120)   时间, 
        sum(case   类别   when   'Au1 '   then   数量   else   0   end)   Au1, 
        sum(case   类别   when   'Au2 '   then   数量   else   0   end)   Au2, 
        sum(case   类别   when   'Au3 '   then   数量   else   0   end)   Au3, 
        sum(case   类别   when   'Au4 '   then   数量   else   0   end)   Au4, 
        sum(数量)   合计 
    from   tb 
    where   convert(varchar(7),时间,120) between left(@y1,5) + '01' and @y1 
    group   by   convert(varchar(7),时间,120) 
    union   all 
    select   convert(varchar(4),时间,120)   时间, 
        sum(case   类别   when   'Au1 '   then   数量   else   0   end)   Au1, 
        sum(case   类别   when   'Au2 '   then   数量   else   0   end)   Au2, 
        sum(case   类别   when   'Au3 '   then   数量   else   0   end)   Au3, 
        sum(case   类别   when   'Au4 '   then   数量   else   0   end)   Au4, 
        sum(数量)   合计 
    from   tb 
    where   convert(varchar(7),时间,120) between left(@y1,5) + '01' and @y1
    group   by   convert(varchar(4),时间,120) 
    /* 
    时间      Au1         Au2         Au3         Au4         合计          
    ------- ----------- ----------- ----------- ----------- ----------- (所影响的行数为 0 行)
    */ drop table tb