50个SQL语句(六)

2015-02-03 12:09:38 · 作者: · 浏览: 349
t * fromstudent s inner joinsc a

on s.sid=a.sid wherecid='01' and score<60 order by score desc?

select * fromstudent s inner join(select * from sc where cid='01' and score<60) a

on s.sid=a.sid orderby a.score?

select student.* , sc.Cid , sc.score from student , sc

where student.Sid = SC.Sid and sc.score <60and sc.Cid ='01'

orderby sc.score desc?

--17☆☆☆、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

思路:全部学生(一个记录集合),全部课程分数和平均分(一个记录集合),两个记录集合进行合并行转列(新的一个记录集合)

select s.sid,s.sname,max(case b.cname when N'语文' then a.score else null end) as '语文',

max(case b.cname when N'数学' then a.score else null end) as '数学',

max(case b.cname when N'英语' then a.score else null end) as '英语',

convert(decimal(18,2),avg(a.score)) as '平均成绩'

from student s left join sc a

on s.sid=a.sid leftjoin course b

on a.cid=b.cid groupby s.sid,s.sname

order by [平均成绩]desc?

--17.1 SQL 2000 静态

select a.Sid 学生编号 , a.Sname 学生姓名 ,

max(case c.Cname when N'语文'then b.score elsenullend) [语文],

max(case c.Cname when N'数学'then b.score elsenullend) [数学],

max(case c.Cname when N'英语'then b.score elsenullend) [英语],

cast(avg(b.score) asdecimal(18,2)) 平均分

from Student a

leftjoin SC b on a.Sid = b.Sid

leftjoin Course c on b.Cid = c.Cid

groupby a.Sid , a.Sname

orderby平均分desc?

--17.2 SQL 2000 动态

declare@sqlnvarchar(4000)

set@sql='select a.Sid '+ N'学生编号'+' , a.Sname '+ N'学生姓名'

select@sql=@sql+',max(case c.Cname when N'''+Cname+''' then b.score else null end) ['+Cname+']'

from (selectdistinct Cname from Course) as t

set@sql=@sql+' , cast(avg(b.score) as decimal(18,2))'+ N'平均分'+' from Student a left join SC b on a.Sid= b.Sid left join Course c on b.Cid = c.Cid

groupby a.Sid , a.Sname order by '+ N'平均分'+' desc'

exec(@sql)?

--17.3 有关sql2005的动静态写法参见我的文章《普通行列转换(version 2.0)》或《普通行列转换(version 3.0)》。

--18☆☆☆☆☆、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率

--及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90

思路:SC表和COURSE表联合查询,每一个字段要求都可以看作是一个子查询,一个一个子查询单独做出来后,再拼接在一起。

select b.cid,b.cname,max(score) as '最高分',min(score) as '最低分',convert(decimal(5,2),avg(score)) as '平均分',

convert(varchar,convert(decimal(5,2),convert(decimal(5,2),count(case when a.score>=60 then 1 else null end))/count(1)*100))+'%' as '及格率',

convert(varchar,convert(decimal(5,2),convert(decimal(5,2),count(case when a.score>=70 and a.score<80 then 1 else null end))/count(1)*100))+'%' as '中等率',

convert(varchar,convert(decimal(5,2),convert(decimal(5,2),count(case when a.score>=80 and a.score<90 then 1 else null end))/count(1)*100))+'%' as '优良率',

convert(varchar,convert(decimal(5,2),convert(decimal(5,2),count(case when a.score>=90 then 1 else null end))/count(1)*100))+'%' as '优秀率'

from sc a inner join course b on a.cid=b.cid group by b.cid,b.cname

--方法1

select m.Cid [课程编号], m.Cname [课程名称],

max(n.score) [最高分],

min(n.score) [最低分],

cast(avg(n.score)asdecimal(18,2)) [平均分],

cast((selectcount(1) from SC where Cid = m.Cid and score >=60)*100.0/ (selectcount(1) from SC where Cid = m.Cid) asdecimal(18,2)) [及格率(%)],

cast((selectcount(1) from SC where Cid = m.Cid and score >=70and score <80 )*100.0/ (selectcount(1) from SC where Cid = m.Cid) asdecimal(18,2)) [中等率(%)],

cast((selectcount(1) from SC where Cid = m.Cid and score >=80and score <90 )*100.0/ (selectcount(1) from SC where Cid = m.Cid) asdecimal(18,2)) [优良率(%)],

cast((selectcount(1) from SC where Cid = m.Cid and score >=90)*100.0/ (selectcount(1) from SC where Cid = m.Cid) asdecimal(18,2)) [优秀率(%)]

from Course m , SC n

where m.Cid = n.Cid

groupby m.Cid , m.Cname

orderby m.Cid

--方法2

select m.Cid [课程