2016-11-21 4 views
0

Ich versuche, eine Abfrage zu erstellen, die die Anzahl der Frauen zählen kann, die ein bestimmtes Modul nehmen, aber habe Probleme mit der Erstellung der Anweisung.Linke Verknüpfung mit Count

Ich habe eine Modultabelle mit:

module_code 
module_title 
module_level 

und mein Schülertisch hat:

student_no 
student_init 
student_lname 
student_gender 
.. and so on 

Das ist, was ich jetzt habe. Ich glaube nicht, dass ich in die richtige Richtung leite:

SELECT COUNT (*) “Total” 
FROM MODULE 
LEFT OUTER JOIN STUDENT 
ON MODULE.MODULE_TITLE 

oder

SELECT COUNT (*) “Total” FROM MODULE 
WHERE MODULE_TITLE = COMPUTER SECURITY 
LEFT JOIN STUDENT 
+0

Haben Sie Ihre Fragen ausprobiert? – Aleksej

+0

Nun ich weiß, es ist nicht komplett abgeschlossen, wie ich Student_Gener von Student vor der Zählung es wählen müsste Ich weiß nur nicht, wie das zu tun – joshwaa

+0

Sie müssen eine Modul Registrierung Tabelle auch richtig? Sie müssen das in Ihre Anfrage werfen. Und Sie sollten einen INNER-Join statt OUTER verwenden. – bassrek

Antwort

0

Sie eine student_id Spalte zu Ihrer module_enrollments Tabelle hinzufügen Angenommen, können Sie die Zählung wie so erhalten:

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

Sie möchten sehr wahrscheinlich Module zeigen, für die keine Frauen angemeldet sind, zusätzlich zu den Modulen, für die Frauen angemeldet sind. Für, dass Sie eine Außen verwenden Sie müssen beitreten:

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; 

Zusätzlich, da Sie nicht wollen, versehentlich Module ohne weibliche Einschreibungen herauszufiltern, die s.gender = 'F' Prädikat sollte stattdessen ein Teil der Verknüpfungskriterien zwischen students und module_enrollment sein als Teil der where Klausel.

Alternativ können Sie eine Pivot verwenden:

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

Wenn Sie wirklich beitreten verwenden möchten ein LEFT statt RIGHT verbinden Sie können das immer noch tun:

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; 

Es ist einfach nicht so leicht zu lesen.

Verwandte Themen