当前位置: 代码迷 >> ASP.NET >> 常见sql面试题 有关问题
  详细解决方案

常见sql面试题 有关问题

热度:7943   发布时间:2013-02-25 00:00:00.0
常见sql面试题 问题
S (SNO,SNAME) 学生关系。SNO 为学号,SNAME 为姓名

C (CNO,CNAME,CTEACHER) 课程关系。CNO 为课程号,CNAME 为课程名,CTEACHER 为任课教师

SC(SNO,CNO,SCGRADE) 选课关系。SCGRADE 为成绩


2. 列出有二门以上(含两门)不及格课程的学生姓名及其平均成绩

--实现代码:

Select S.SNO,S.SNAME,AVG_SCGRADE=AVG(SC.SCGRADE) FROM S,SC,( Select SNO FROM SC Where SCGRADE<60 GROUP BY SNO HAVING COUNT(DISTINCT CNO)>=2 )A Where S.SNO=A.SNO AND SC.SNO=A.SNO GROUP BY S.SNO,S.SNAME

COUNT(DISTINCT CNO)>=2 这个特么的对吗 ?是不是改成 COUNT(SNO)>=2 才对。

Sno Cno Scgrade

1 1 25

2 3 21
----------------------------- 
1 2 54  

2 2 51

 假如 查出来结果集是 横线上面 两条 , 如果查出这样的结果 distinct Cno 后 是 1和3 count后 是2条 ?这样不是满足 >=2吗 ? 

这道面试题是不是错了 ?还是我想错了 ? 求指点。




------解决方案--------------------------------------------------------
SQL code
select 姓名=S.Sname,avg(SCGRADE) as 平均成绩 from S,SC where S.Sno=SC.Sno and S.Sno in(select Sno  from SC  group by Sno having (sum(case when SCGRADE<60 then 1 else 0 end)>=2)) group by S.Sname
------解决方案--------------------------------------------------------
这道题是没错的,COUNT(DISTINCT column_name) 是指函数返回指定列的不同值的数目的意思,所以
Select SNO FROM SC Where SCGRADE<60 GROUP BY SNO HAVING COUNT(DISTINCT CNO)>=2 这句话就是指在sc表里SCGRADE小于60(不及格)和前面查出来的不及格的所有记录,然后用HAVING COUNT(DISTINCT CNO)>=2把里面的一个人选择的课程数量统计出来,置条件大于等于2,这个是没问题的。
  相关解决方案