--测试数据:
create table tb(分部 varchar(10) , 名称 varchar(10) , 数量 int)
insert into tb values('上海' , '语文' , 74)
insert into tb values('上海' , '数学' , 83)
insert into tb values('上海' , '物理' , 93)
insert into tb values('南京' , '语文' , 74)
insert into tb values('南京' , '数学' , 84)
insert into tb values('南京' , '物理' , 94)
go
--下面是查询语句
declare @sql varchar(8000)
set @sql = 'select 分部 '
select @sql = @sql + ' , sum(case 名称 when ''' + 名称 + ''' then 数量 else 0 end) [' + 名称 + ']'
from (select distinct 名称 from tb) as a
set @sql = @sql + ' from tb group by 分部'
exec(@sql)
要实现效果是
分部    数学    物理    语文 
南京    84       94      74
上海    83       93      74
合计   167      187      148 
关键是最后一行合计怎么来用sql语句完成查询。我的数据库环境是sql2000.

解决方案 »

  1.   

    declare @sql varchar(8000)
    select @sql = isnull(@sql,'') + ',sum(case 名称 when ''' + 名称 + ''' then 数量 else 0 end) [' + 名称 + ']'
    from (select distinct 名称 from tb) as a
    set @sql = 'select 分部'+@sql + ' from tb group by 分部 union all select ''合计'''+@sql+' from tb'
    exec(@sql)
      

  2.   

    --2005以上版本适用
    declare @sql nvarchar(max),@col nvarchar(max)
    select @sql=isnull(@sql+',','')+ quotename(名称) from tb group by 名称
    select @col=isnull(@col+',sum(','sum(')+ quotename(名称)+')' from tb group by 名称
    set @sql=';with cte as (select * from tb pivot (sum(数量) for sub in ('+@sql+'))a)
    select * from cte union all select ''合计'','+@col+' from cte'
    --select @sql
    exec(@sql)
      

  3.   


    select [分部]
    ,max(case when [名称]='数学' then [数量] else 0 end) [数学]
    ,max(case when [名称]='物理' then [数量] else 0 end) [物理]
    ,max(case when [名称]='语文' then [数量] else 0 end) [语文]
    from(
     select [分部],[名称],'数量'=sum([数量]) from tb group by [分部],[名称]
     union all
     select '分部'='合计',[名称],'数量'=sum([数量]) from tb group by [名称]
    )a group by [分部]
    order by case when [分部]='合计' then 1 else 0 end--结果
    分部         数学          物理          语文
    ---------- ----------- ----------- -----------
    南京         84          94          74
    上海         83          93          74
    合计         167         187         148(3 行受影响)
      

  4.   

    exec('select id=row_number()over(order by getdate()),* from('+@sql+')t')
      

  5.   

    我的当前环境是sql2000的。不支持这个函数。
      

  6.   

    加序号一般是前台程序做的,不建议在SQL中处理
    declare @sql varchar(8000)
     set @sql = 'select sno=identity(int,1,1),isnull(分部,''合计'') as 分部 '
    select @sql = @sql + ' , sum(case 名称 when ''' + 名称 + ''' then 数量 else 0 end) [' + 名称 + ']'
    from (select distinct 名称 from tb) as a
     set @sql = @sql + ' into ##tmp from tb group by 分部 with rollup'
    exec(@sql)select * from ##tmp
    /**
    sno         分部         数学          物理          语文
    ----------- ---------- ----------- ----------- -----------
    1           南京         84          94          74
    2           上海         83          93          74
    3           合计         167         187         148(3 行受影响)
    **/
      

  7.   

    set @sql = 'select IDENTITY(int,1,1) as id,* into # from (select 分部'+@sql + ' from tb group by 分部 union all select ''合计'''+@sql+' from tb)t;select * from #'