SQL小问题

来源:百度知道 编辑:UC知道 时间:2024/07/16 14:29:13
有两个表
表student的列是:cnum(课程号),cname(课名).....
表sc的列是:snum(学号),cnum,score(分数).....
问题:统计每门课程的选修人数和不及格人数,输出的列是:cname,选修人数,不及格人数。
我知道两个问题分开写是很容易的,怎么把这两个联起来,一起输出
二楼三楼都出现“‘〈’附近有语法错误”

select count(sc.snum) as 选修人数,count(ssc.ssnum) as 不及格人数,student.
cname
from sc
inner join (select case when score<60 then snum else null end as ssum,cnum,snum
from sc) as ssc on ssc.snum=sc.snum and ssc.cnum=sc.cnum
inner join student on student.cnum=sc.cnum

上面的例子作一个说明,说白了就是将原表数据中不及格的人的数据滤出来和原表作关联。这样count的时候是忽视null的,所以就能查出选修人数和不及格人数
少了一个when呵呵

怎么把这两个联起来,一起输出
使用join将两个表的列叠加起来,主要是设置join的条件(可以利用表的别名)
相信自己实践去做一下,没问题的,
呵呵,希望能有帮助,^_^

SELECT cname, SUM(aa) AS 选修人数, SUM(bb) AS 不及格人数
FROM ((SELECT cname, COUNT(cname) AS aa, 0 AS bb
FROM student a,sc
where a.cnum=sc.cnum
GROUP BY cname)
UNION
(SELECT cname, 0 AS aa, COUN(cname) AS bb
FROM student a,sc
where a.cnum=sc.cnum and score < 60
GROUP BY cname)) cc
GROUP BY cname

表的连接查询

select s.cname,count(sc.snum) 选修人数,count(sc.score-60<0) 不及格人数 fr