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

求写1SQL语句(求数据库大神解答)

2013-09-12 
求写一SQL语句(求数据库大神解答)学生表名:stu各个字段:编号(id) 学号(sno) 课程号(cno) 成绩(grade)问题:

求写一SQL语句(求数据库大神解答)
学生表名:stu
各个字段:
编号(id) 学号(sno) 课程号(cno) 成绩(grade)

问题:
找出各科中前两名的 显示格式如下:
课程号 第一名学号 第二名学号 第一名成绩 第二名成绩 数据库 sql 学生表 前两名显示在同一行
[解决办法]



create table cjb(学号 char (10),课程名 char (10),成绩 [decimal](12, 2))
insert into cjb 
select '001','数据库',  78 union
select '002','信息管理',80 union
select '003','专业英语',89 union
select '004','数据库'  ,62 union
select '005','信息管理',50 union
select '006','专业英语',56 union
select '007','数据库'  ,90 union
select '008','信息管理',67 union
select '009','专业英语',75

select 课程名,max(case when rn=1 then 学号 end) as 第一名学号,
max(case when rn=2 then 学号 end) as 第二名学号,
max(case when rn=1 then 成绩 end) as 第一名成绩,
max(case when rn=2 then 成绩 end) as 第二名成绩
from 
(select *
from (select *,rn=ROW_NUMBER() over(partition by 课程名 order by 成绩 desc) from  cjb)t
where rn<=2
)t
group by 课程名
   
drop  table cjb

/*
课程名第一名学号第二名学号第一名成绩第二名成绩
数据库    007       001       90.0078.00
信息管理  002       008       80.0067.00
专业英语  003       009       89.0075.00
*/




[解决办法]
没有测试

 
        select cno,
        max(case when pm=1 then sno else 0 end),
        max(case when pm=2 then sno else 0 end),


        max(case when pm=1 then cno else 0 end),
        max(case when pm=2 then cno else 0 end)
        from (
        
        select cno,sno,grade,row_number()over(partition by cno order by grade desc) as pm
        from stu
        
        )t
        group by cno

热点排行