现有表1
姓名 单位 成绩 名次 类别
王一 行政 9.80 1
王二 工商 9.75 1
王三 法律 9.88 1
王五 工商 9.77 2
......
转换成表2
名次 第一名 第二名 第三名 第四名 第五名 第六名 第七名 第八名
单位 法律 行政
姓名 王三 王一
成绩 9.88 9.80
1.表1行不定,名次按输入的成绩进行排序
2.表2在.net中显示,若表一行小于8,则按表1的行数(例5行)自动填充表(例填充第一到第五名的数据)
--> 测试数据: [表1]
if object_id('[表1]') is not null drop table [表1]
create table [表1] (姓名 varchar(4),单位 varchar(4),成绩 numeric(3,2),名次 int,类别 int)
insert into [表1]
select '王一','行政',9.80,null,1 union all
select '王二','工商',9.75,null,1 union all
select '王三','法律',9.88,null,1 union all
select '王五','工商',9.77,null,2
declare @sql1 varchar(8000),@sql2 varchar(8000),@sql3 varchar(8000)
set @sql1='select ''单位''名次'
set @sql2='select ''姓名''名次'
set @sql3='select ''成绩''名次'
select @sql1=@sql1+',[第'+ltrim(名次)+'名]=max(case 名次 when '''+ltrim(名次)+''' then 单位 else '''' end)',
@sql2=@sql2+',[第'+ltrim(名次)+'名]=max(case 名次 when '''+ltrim(名次)+''' then 姓名 else '''' end)',
@sql3=@sql3+',[第'+ltrim(名次)+'名]=max(case 名次 when '''+ltrim(名次)+''' then ltrim(成绩) else '''' end)'
from (select 名次=(select count(1) from 表1 where 成绩>=a.成绩) from [表1] a)b order by 名次
set @sql1=@sql1+' from (select 单位,名次=(select count(1) from 表1 where 成绩>=a.成绩) from [表1] a)b'
set @sql2=@sql2+' from (select 姓名,名次=(select count(1) from 表1 where 成绩>=a.成绩) from [表1] a)b'
set @sql3=@sql3+' from (select 成绩,名次=(select count(1) from 表1 where 成绩>=a.成绩) from [表1] a)b'
exec( @sql1+' union all '+@sql2+' union all '+@sql3)
--结果:
名次 第1名 第2名 第3名 第4名
---- ---------------- ---------------- ---------------- ----------------
单位 法律 行政 工商 工商
姓名 王三 王一 王五 王二
成绩 9.88 9.80 9.77 9.75
谢谢你的回复
现还有一问题,若表1中数据较多,故增加了一行类别,如何根据给定的类别(例=1,见改动表)进行上述操作