2016-11-21 6 views
0

Я пытаюсь создать запрос, который может подсчитать количество женщин, берущих определенный модуль, но у меня возникают проблемы с получением инструкции create.left join with count

У меня есть таблица модуля с:

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

Вы пробовали свои вопросы? – Aleksej

+0

хорошо, я знаю, что это не полная версия, так как мне нужно будет выбрать student_gender из ученика, прежде чем считать его, я просто не знаю, как это сделать – joshwaa

+0

У вас также должна быть таблица регистрации модулей? Вам нужно бросить это в свой запрос. И вы должны использовать INNER-соединение, а не OUTER. – bassrek

ответ

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 
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; 

Это просто не так легко читать.