动态列的处理(统计)。

思路:
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

posted @ 2009-12-14 14:58  傲衣华少  阅读(182)  评论(0编辑  收藏  举报