我正在尝试创建一个查询,该查询可以计算获取特定模块的女性数量但是在获取创建语句时遇到问题。
我有一个模块表:
module_code
module_title
module_level
我的学生表有:
student_no
student_init
student_lname
student_gender
.. and so on
这就是我现在所拥有的。我不认为我正朝着正确的方向前进:
SELECT COUNT (*) “Total”
FROM MODULE
LEFT OUTER JOIN STUDENT
ON MODULE.MODULE_TITLE
或
SELECT COUNT (*) “Total” FROM MODULE
WHERE MODULE_TITLE = COMPUTER SECURITY
LEFT JOIN STUDENT
答案 0 :(得分:0)
假设您在student_id
表中添加了module_enrollments
列,您可以这样计算:
SELECT m.module_title
, COUNT(*)
FROM module_enrollments me
INNER JOIN student s ON s.ID = me.student_id
INNER JOIN module m ON m.ID = me.module_id
WHERE s.Gender = 'F'
GROUP BY m.module_title
答案 1 :(得分:0)
除了女性注册的模块的计数之外,您最有可能想要展示没有女性注册的模块。为此,您需要使用外部联接:
SELECT m.module_title
, COUNT( s.student_id ) female_cnt
FROM student s
JOIN module_enrollment me
ON s.student_id = me.student_id
AND s.gender = 'F'
RIGHT JOIN module m
ON me.module_id = m.module_id
GROUP BY m.module_title;
此外,由于您不想意外过滤掉没有女性注册的模块,因此s.gender = 'F'
谓词应该是students
和module_enrollment
之间的加入条件的一部分,而不是作为where
子句的一部分。
或者你可以使用一个支点:
with src as (
SELECT m.module_title
, s.gender
FROM student s
JOIN module_enrollment me
ON s.student_id = me.student_id
RIGHT JOIN module m
ON me.module_id = m.module_id
)
select *
from src PIVOT (count(*) cnt
for gender in ('F' as female));
如果您真的想使用LEFT
加入而不是RIGHT
加入,您仍然可以这样做:
select m.module_title
, count(s.student_id)
from module m
left join module_enrollment me
join student s
on s.student_id = me.student_id
and s.gender = 'F'
on me.module_id = m.module_id
group by module_title;
它不那么容易阅读。