思路:
sysobjects ,系统表,用于存放数据库中所有表的信息。
syscolumns ,系统表,用于存放数据库中所有表的列信息。
两表通过关键字id关联。int型,代表表序号。
送上述表中获得动态表的列名:
select b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='TB'
然后,便容易处理了。统计用with rollup/cube.
具体事例如下:
====================================
--> 测试数据:
if object_id('') is not null drop table
create table ([姓名] varchar(4),[学期] int,[语文] int,[数学] int,[英语] int,[政治] int)
insert
select '张三',1,70,60,80,30 union all
select '张三',2,80,90,75,40 union all
select '张三',3,50,70,85,60 union all
select '李四',1,66,80,90,55 union all
select '李四',2,75,70,85,65
declare @s varchar(4000)
set @s=''
select @s=isnull(@s+',','')+'['+b.name+']=sum(['+b.name+'])' from sysobjects a,syscolumns b
where a.id=b.id and a.name='TB' and b.name not in('姓名','学期')
exec('select [姓名]=CASE WHEN (GROUPING([姓名]) = 1) THEN ''合计'' else [姓名] END ,
[学期]=isnull(CASE WHEN GROUPING([姓名])=0 and GROUPING([学期])=1 THEN ''小计'' else cast([学期] as varchar(10)) END,'''')'+@s+' from TB
group by [姓名],[学期] WITH ROLLUP')
/*
姓名 学期 语文 数学 英语 政治
---- ---------- ----------- ----------- ----------- -----------
李四 1 66 80 90 55
李四 2 75 70 85 65
李四 小计 141 150 175 120
张三 1 70 60 80 30
张三 2 80 90 75 40
张三 3 50 70 85 60
张三 小计 200 220 240 130
合计 341 370 415 250
(8 行受影响)
*/
drop table TB