首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

sql查询排列有关问题

2012-01-26 
sql查询排列问题比如表的信息是科目表lessionid(课程号)lessionname(课程名)l001C语言l002C++l003VB.NET..

sql查询排列问题
比如表的信息是
科目表
lessionid(课程号)   lessionname(课程名)
l001                             C语言
l002                             C++
l003                             VB.NET
....

人员信息表
stuid(学号)         stuname(姓名)   ....
001                         刘大
002                         关二
003                         张三
...

分数信息表
stuid(学号)         lessionid(课程号)       score(分数)
001                         l001                                 99
002                         l002                                 88
003                         l003                                 77
...
           
学号       姓名         C语言       C++       VB.NET   ...
001         刘大         99             99         99
002         关二         88             88         88
003         张三         77             77         77
我不要那种固定格式输出,因为课程名可能有变动的.那种固定一旦变动了课程信息就还得改动程序,很不方便.

[解决办法]
if object_id( 'pubs..科目表 ') is not null
drop table 科目表
go
create table 科目表(lessionid varchar(10),lessionname varchar(10))
insert into 科目表(lessionid,lessionname) values( 'l001 ', 'C语言 ')
insert into 科目表(lessionid,lessionname) values( 'l002 ', 'C++ ')
insert into 科目表(lessionid,lessionname) values( 'l003 ', 'VB.NET ')
go

if object_id( 'pubs..人员信息表 ') is not null
drop table 人员信息表
go
create table 人员信息表(stuid varchar(10),stuname varchar(10))
insert into 人员信息表(stuid,stuname) values( '001 ', '刘大 ')
insert into 人员信息表(stuid,stuname) values( '002 ', '关二 ')
insert into 人员信息表(stuid,stuname) values( '003 ', '张三 ')
go

if object_id( 'pubs..分数信息表 ') is not null
drop table 分数信息表
go
create table 分数信息表(stuid varchar(10),lessionid varchar(10),score int)
insert into 分数信息表(stuid,lessionid,score) values( '001 ', 'l001 ',99)
insert into 分数信息表(stuid,lessionid,score) values( '002 ', 'l002 ',88)
insert into 分数信息表(stuid,lessionid,score) values( '003 ', 'l003 ',77)
go

declare @sql varchar(8000)
set @sql = 'select stuid,stuname '
select @sql = @sql + ' , max(case lessionname when ' ' ' + lessionname + ' ' ' then score else null end) [ ' + lessionname + '] '


from (select distinct lessionname from (select a.stuid , b.stuname , c.lessionname , a.score from 科目表 c, 人员信息表 b, 分数信息表 a where a.stuid = b.stuid and a.lessionid = c.lessionid) t ) as a
set @sql = @sql + ' from (select a.stuid , b.stuname , c.lessionname , a.score from 科目表 c, 人员信息表 b, 分数信息表 a where a.stuid = b.stuid and a.lessionid = c.lessionid) t group by stuid,stuname '
exec(@sql)

drop table 科目表, 人员信息表 , 分数信息表

/*
stuid stuname C++ C语言 VB.NET
---------- ---------- ----------- ----------- -----------
002 关二 88 NULL NULL
001 刘大 NULL 99 NULL
003 张三 NULL NULL 77
*/

热点排行