50个SQL语句(十)

2015-02-03 12:09:38 · 作者: · 浏览: 357
用函数进行排序。

select s.sid,s.sname,row_number() over(order by avg(score) desc) as ranking,convert(decimal(18,2),

avg(score)) as '平均成绩' from student s inner join sc a on s.sid=a.sid group by s.sid,s.sname

只显示有成绩的学生。?

select s.sid,s.sname,row_number() over(order by avg(score) desc) as ranking,convert(decimal(18,2),

avg(score)) as '平均成绩' from student s left join sc a on s.sid=a.sid group by s.sid,s.sname

显示所有学生。?

--24.1 查询学生的平均成绩并进行排名,sql 2000用子查询完成,分平均成绩重复时保留名次空缺和不保留名次空缺两种。

select t1.* , px = (selectcount(1) from

(

select m.Sid [学生编号] ,

m.Sname [学生姓名] ,

isnull(cast(avg(score) asdecimal(18,2)),0) [平均成绩]

from Student m leftjoin SC non m.Sid = n.Sid

groupby m.Sid, m.Sname

)t2 where平均成绩> t1.平均成绩) +1from

(

select m.Sid [学生编号] ,

m.Sname [学生姓名] ,

isnull(cast(avg(score) asdecimal(18,2)),0) [平均成绩]

from Student m leftjoin SC non m.Sid = n.Sid

groupby m.Sid, m.Sname

)t1

orderby px?

select t1.* , px = (selectcount(distinct平均成绩) from

(

select m.Sid [学生编号] ,

m.Sname [学生姓名] ,

isnull(cast(avg(score) asdecimal(18,2)),0) [平均成绩]

from Student m leftjoin SC non m.Sid = n.Sid

groupby m.Sid, m.Sname

)t2 where平均成绩>= t1.平均成绩) from

(

select m.Sid [学生编号] ,

m.Sname [学生姓名] ,

isnull(cast(avg(score) asdecimal(18,2)),0) [平均成绩]

from Student m leftjoin SC non m.Sid = n.Sid

groupby m.Sid, m.Sname

)t1

orderby px?

--24.2 查询学生的平均成绩并进行排名,sql 2005用rank,DENSE_RANK完成,分平均成绩重复时保留名次空缺和不保留名次空缺两种。

select t.* , px = rank() over(orderby[平均成绩]desc) from

(

select m.Sid [学生编号] ,

m.Sname [学生姓名] ,

isnull(cast(avg(score) asdecimal(18,2)),0) [平均成绩]

from Student m leftjoin SC non m.Sid = n.Sid

groupby m.Sid, m.Sname

)t

orderby px?

select t.* , px = DENSE_RANK() over(orderby[平均成绩]desc) from

(

select m.Sid [学生编号] ,

m.Sname [学生姓名] ,

isnull(cast(avg(score) asdecimal(18,2)),0) [平均成绩]

from Student m leftjoin SC non m.Sid = n.Sid

groupby m.Sid, m.Sname

)t

orderby px?

--25、查询各科成绩前三名的记录

思路:各学科成绩排序(一个记录集合),再取前3。

select * from

(select row_number() over(partition by a.cidorder by a.score desc)as ranking,

s.sid,s.sname,a.score from student s innerjoin sc a on s.sid=a.sid) t where ranking in (1,2,3)?

--25.1 分数重复时保留名次空缺

select m.* , n.Cid , n.score from Student m, SC n where m.Sid = n.Sid and n.score in

(selecttop3 score from sc where Cid = n.Cid orderby score desc) orderby n.Cid , n.score desc?

--25.2 分数重复时不保留名次空缺,合并名次

--sql 2000用子查询实现

select*from (select t.* , px = (selectcount(distinct score) from SC where Cid = t.Cid and score >= t.score) from sc t) m where px between1and3orderby m.cid , m.px

--sql 2005用DENSE_RANK实现

select*from (select t.* , px = DENSE_RANK() over(partition by cid orderby score desc) from sc t) m where px between1and3orderby m.Cid , m.px?

--26、查询每门课程被选修的学生数

思路:每门课被选修的学生数(一个记录集合)。

select * fromcourse a inner join

(select cid,count(*) as '人数' from sc group by cid) b

on a.cid=b.cid?

select a.cid,a.cname,count(1) as '人数' from course a inner join sc b

on a.cid=b.cid groupby a.cid,a.cname?

select cid , count(Sid)[学生数]from sc groupby Cid?

--27、查询出只有两门课程的全部学生的学号和姓名

select Student.Sid ,Student.Sname

from Student , SC

where Student.Sid = SC.Sid

groupby Student.Sid , Student.Sname

havingcount(SC.Cid) =2

orderby Student.Sid?

--28、查询男生、女生人数

思路:

select ssex,count(1)as '人数' from student group by ssex?

selectcount(Ssex) as男生人数from Student where Ssex = N'男'

selectcount(Ssex) as女生人数from Student where Ssex = N'女'

selectsum(casewhen Ssex = N'男'then1else0end) [男生人数],sum(casewhen