2016-11-21 4 views
0

特定のモジュールを使用している女性の数を数えることができますが、作成ステートメントの取得に問題があるクエリを作成しようとしています。残数との結合

私はモジュールテーブルを持っている:

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

あなたもモジュールの登録テーブルを持っている必要がありますか?あなたはあなたの質問にそれを投げる必要があります。また、OUTERではなくINNER結合を使用する必要があります。 – bassrek

答えて

0

をあなたがそうのようなカウントを取得することができ、あなたのmodule_enrollmentsテーブルにstudent_id列を追加すると仮定:

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

女性が登録されていないモジュールを表示する場合は、女性が登録されているモジュールのカウントに加えて、登録することをお勧めします。あなたが誤っていない女性の入学を持つモジュールをフィルタしたくないので、s.gender = 'F'述語はstudents、代わりにmodule_enrollment間の結合条件の一部であるべきさらに

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; 

:そのためにあなたは、外部結合を使用する必要がありますwhere句の一部としてあなたが本当にLEFTRIGHTあなたはまだそれを行うことができます参加する代わりに結合を使用したい場合は

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

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; 

それが同じように簡単ではありません

別の方法としては、ピボットを使用することができます読む。

関連する問題