--你的T表要有时间字段,然后传递过来:declare @s varchar(8000),@dtime varchar(10)
set @s='select 采购单位'
set @dtime='时间字段'
select @s=@s+',['+类别+']=sum(case 类别 when '''+类别+''' then 单价 else 0 end)'
from t group by 类别 order by 类别
set @s=@s+' from t where 时间字段='''+@dtime+''' group by 采购单位 order by 采购单位'
exec(@s)

解决方案 »

  1.   

    --测试环境
    create table t(商品名称 varchar(20),单价 int,数量 int,类别 varchar(20),采购单位 varchar(20))
    insert into t select 'cpu   ',1500,2 ,'电脑类','科技大厦'
    insert into t select '内存条',100 ,1 ,'电脑类','电脑公司'
    insert into t select 'cpu   ',1000,1 ,'电脑类','科技大厦'
    insert into t select '油笔  ',5   ,5 ,'日常类','日用品公司'
    insert into t select '电脑书',45  ,10,'书籍类','书店'
    insert into t select '笔记本',100 ,1 ,'日常类','电脑公司'--动态SQLdeclare @s varchar(8000)
    set @s='select 采购单位=case when grouping(采购单位)=1 then ''合计'' else 采购单位 end '
    select @s=@s+',['+类别+']=sum(case 类别 when '''+类别+''' then 单价 else 0 end)'
    from t group by 类别 order by 类别
    set @s=@s+' ,[合计]=(select isnull(cast(sum(单价) as varchar),'''') from t where 采购单位=A.采购单位) from t A  group by 采购单位 WITH ROLLUP '
    print @s
    exec(@s)--测试结果采购单位    电脑类    日常类    书籍类    合计
    ---------  --------  --------  ------------------
    电脑公司 100 100 0 200
    科技大厦 2500 0 0 2500
    日用品公司0 5 0 5
    书店 0 0 45 45
    合计 2600 105 45
    --删除测试环境Drop table T
      

  2.   

    if exists (select * from sysobjects where id=object_id(N'dbo.t') and objectproperty(id,N'isUserTable')=1)
    drop table t
    create table t(商品名称 varchar(20),单价 int,数量 int,类别 varchar(20),采购单位 varchar(20))
    insert into t select 'cpu   ',1500,2 ,'电脑类','科技大厦'
    insert into t select '内存条',100 ,1 ,'电脑类','电脑公司'
    insert into t select 'cpu   ',1000,1 ,'电脑类','科技大厦'
    insert into t select '油笔  ',5   ,5 ,'日常类','日用品公司'
    insert into t select '电脑书',45  ,10,'书籍类','书店'
    insert into t select '笔记本',100 ,1 ,'日常类','电脑公司'
    declare @sql varchar(8000)
    select @sql = 'select case when grouping(采购单位)=0 then 采购单位 else ''合计'' end as 采购单位'
    select @sql = @sql+',['+类别+']=isnull(sum(case when 类别='''+类别+''' then 单价 end),0)'
    from t group by 类别
    select @sql=@sql+',sum(单价) as 合计 from t group by 采购单位 with rollup'exec(@sql)
    drop table t采购单位                 电脑类         日常类         书籍类         合计          
    -------------------- ----------- ----------- ----------- ----------- 
    电脑公司                 100         100         0           200
    科技大厦                 2500        0           0           2500
    日用品公司                0           5           0           5
    书店                   0           0           45          45
    合计                   2600        105         45          2750警告: 聚合或其它 SET 操作消除了空值。