左连接计数

时间:2016-11-21 16:34:56

标签: sql oracle join count left-join

我正在尝试创建一个查询,该查询可以计算获取特定模块的女性数量但是在获取创建语句时遇到问题。

我有一个模块表:

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

2 个答案:

答案 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'谓词应该是studentsmodule_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;

它不那么容易阅读。