日期:2014-05-18  浏览次数:20363 次

求SQL语句 内容如下 难度不小,牛B的来
先说一下我的数据库
表 学生成绩:
学号 姓名 课程名称 成绩 班级编号 学期
001 李一 数学 99 101 1
001 李一 语文 100 101 1
001 李一 英语 80 101 1
001 李一 数学 99 101 2
001 李一 语文 100 101 2
001 李一 英语 80 101 2


要求用一SQL语句生成以下表:

学号 姓名 学期 课程1 成绩1 课程2 成绩2 课程3 成绩3 班级编号
001 李一 1 数学 99 语文 100 英语 80 101
001 李一 2 数学 99 语文 100 英语 80 101



要求完整的SQL语句 MSSQL 2005 100分作为酬劳



------解决方案--------------------
SQL code
create table tb(学号 varchar(10),姓名 varchar(10),课程名称 varchar(10),成绩 int,班级编号 int,学期 int)
insert into tb values('001','李一','数学',       99  ,    101,       1) 
insert into tb values('001','李一','语文',       100 ,    101,       1) 
insert into tb values('001','李一','英语',       80  ,    101,       1) 
insert into tb values('001','李一','数学',       99  ,    101,       2) 
insert into tb values('001','李一','语文',       100 ,    101,       2) 
insert into tb values('001','李一','英语',       80  ,    101,       2)
go

declare @sql varchar(8000)
set @sql = 'select 学号,姓名,学期'
select @sql = @sql + ' , max(case px when ''' + cast(px as varchar) + ''' then 课程名称 else '' '' end) [课程' + cast(px as varchar) + ']'
                   + ' , max(case px when ''' + cast(px as varchar) + ''' then 成绩 else 0 end) [成绩' + cast(px as varchar) + ']'
from (select distinct px from (select px=(select count(1) from tb where 学号=a.学号 and 姓名=a.姓名 and 学期 = a.学期 and 班级编号=a.班级编号 and 成绩<a.成绩)+1 , * from tb a) t) as a
set @sql = @sql + ',班级编号 from (select px=(select count(1) from tb where 学号=a.学号 and 姓名=a.姓名 and 学期 = a.学期 and 班级编号=a.班级编号 and 成绩<a.成绩)+1 , * from tb a) t group by 学号,姓名,学期,班级编号'
exec(@sql) 

drop table tb

/*
学号  姓名  学期  课程1  成绩1  课程2 成绩2  课程3 成绩3 班级编号        
---- ---- ----  ----  ----  ----- ----- ----- ---- ----------- 
001  李一   1    英语   80    数学   99    语文  100  101
001  李一   2    英语   80    数学   99    语文  100  101
*/

------解决方案--------------------
SQL code
DECLARE @T TABLE(XH INT,NAME VARCHAR(20),KC VARCHAR(20),CJ INT,BJBH INT,XQ INT)
INSERT INTO @T
SELECT 001   ,'李一'    ,'数学',       99,      101,       1 
UNION ALL SELECT 001,   '李一',    '语文',       100,     101,       1 
UNION ALL SELECT 001,   '李一',    '英语',       80,      101,       1 
UNION ALL SELECT 001,   '李一',    '数学',       99,      101,       2 
UNION ALL SELECT 001,   '李一',    '语文',       100,     101,       2 
UNION ALL SELECT 001,   '李一',    '英语',       80,      101,       2 

SELECT XH,NAME,XQ,KC1='数学',MAX(CASE WHEN KC='数学' THEN CJ END) CJ1,
        KC2='语文',MAX(CASE WHEN KC='语文' THEN CJ END) CJ2,
        KC3='英语',MAX(CASE WHEN KC='英语' THEN CJ END) CJ3,BJBH FROM @T GROUP BY XQ,XH,NAME,BJBH

------解决方案--------------------
SQL code

DECLARE @T TABLE(学号 varchar(10),姓名 varchar(10),课程名称 varchar(10),成绩 int,班级编号 int,学期 int)
INSERT INTO @T
SELECT 001   ,'李一'    ,'数学',       99,      101,       1 
UNION ALL SELECT 001,   '李一',    '语文',       100,     101,       1 
UNION ALL SELECT 001,   '李一',    '英语',       80,      101,       1 
UNION ALL SELECT 001,   '李一',    '数学',       99,      101,       2 
UNION ALL SELECT 001,   '李一',    '语文',       100,     101,       2 
UNION ALL SELECT 001,   '李一',    '英语',       80,      101,       2 

select 学号,姓名,学期,
课程名称='数学',成绩=max(case when 课程名称='数学' then 成绩 end),
课程名称='s v