2017-03-13 3 views
0

Ich habe eine Frage in MySQL gefunden, die ich versuche. Bitte sagen Sie mir, ob die folgende Lösung funktioniert oder gibt es eine bessere Lösung?Name der Abteilung und Anzahl der Studenten

select D.DEPT_NAME, COUNT(*) 
from  Departments D 
left outer join STUDENTS S 
on  S.Dept_ID = D.Dept_ID 
group by D.DEPT_NAME 
order by 2 desc, 1 

Students Tabelle hat folgende Felder:

Student_ID 
Student_Name 
Gender 
Dept_ID 

Abteilungen Tabelle hat folgende Felder:

Dept_ID 
Dept_Name 

Eine Universität verwendet 2 Datentabellen, Studenten und Abteilungen, um Daten zu speichern über seine Studenten und die mit jedem Major verbundenen Abteilungen.

  • eine Abfrage, die jeweiligen Abteilungsnamen und die Anzahl der Studenten majoring in jeder Abteilung für alle Abteilungen in der Tabelle Departments (auch solche ohne Studierende) zu drucken.

  • Sortieren Sie Ihre Ergebnisse nach absteigender Anzahl der Studenten; Wenn zwei oder mehr Abteilungen dieselbe Anzahl an Studenten haben, sortieren Sie diese Abteilungen alphabetisch nach Abteilungsnamen.

+1

ein mögliches Problem ist das 'COUNT (*)'. Was kommt zurück, wenn die Abteilung keine Studenten hat? Ich denke, es wird 1 sein, weil es eine Zeile für diese Abteilung gibt. –

+0

Ich hatte Recht, siehe http://sqlfiddle.com/#!15/39a8b/1/0 - 2 Abteilungen (Mathematik und Physik) ohne Schüler, Ihre Abfrage zeigt Count 1 für sie. –

+0

@ marek.janccuska Können Sie mir bitte die SQL-Abfrage sagen, die funktioniert? – SolakiR

Antwort

1

Sie brauchen einen Weg, um die Schüler in jeder Abteilung zu zählen, dann müssen Sie einen Weg alle Abteilungen aufzulisten, auch solche ohne Studenten.

Zählt man die Studenten in jeder Abteilung: (http://sqlfiddle.com/#!15/39a8b/15/0)

  SELECT Dept_ID, COUNT(*) Students 
      FROM STUDENTS 
      GROUP BY Dept_ID 

Dann behandeln, dass als Unterabfrage, es zu einem anderen Tisch sitzen gelassen. (http://sqlfiddle.com/#!15/39a8b/16/0)

SELECT D.DEPT_NAME, S.Students 
    FROM Departments D 
    LEFT JOIN (
      SELECT Dept_ID, COUNT(*) Students 
      FROM STUDENTS 
      GROUP BY Dept_ID 
     ) S ON D.Dept_ID = S.Dept_ID 

Die LEFT JOIN bewahrt Zeilen in der Tabelle DEPARTMENTS, die nicht die ON Klausel passen. Das bringt dir solche Sachen.

Biology   7 
    Mathematics (NULL) 
    Sociology  11 
    Physics   3 

Sie müssen also mit diesem (NULL) Problem umgehen. Hier ist wie. Ändern Sie die SELECT sagen

SELECT D.DEPT_NAME, IFNULL(S.Students,0) 

Es ist ein wenig schwierig, einen Tisch zu einem Aggregat zu verbinden, in dem das Aggregat (die COUNT/GROUP BY-Abfrage) hat Daten fehlen. Aber so machst du es.

Sie können die ORDER BY Sachen auf eigene Faust herausfinden.

2

Verzeihen Sie mir die Formatierung des Codes zu ändern.

würde ich die ORDER BY ändern, wie folgt:

SELECT 
    d.DEPT_NAME, 
    COUNT(s.STUDENT_ID) 
FROM 
    Departments d 
    LEFT JOIN Students s ON d.DEPT_ID = s.DEPT_ID 
GROUP by 
    d.DEPT_ID 
ORDER by 
    COUNT(s.STUDENT_ID) DESC, 
    d.DEPT_NAME ASC 
0

excute unten.

SELECT 
    ad.Dept_Name, 
    count(ass.Student_Id) as Stduent_Enrolled 

    FROM [Alok.Departments] ad 

    Left Outer Join [Alok.Students] ass 
     ON ad.Dept_ID = ass.Dept_ID 

    Group by ad.Dept_Name 

    ORDER by 
     CASE WHEN COUNT(ad.Dept_ID) >=2 
      THEN ad.DEPT_NAME END desc, 
     CASE WHEN COUNT(ad.Dept_ID) < 2 
      THEN ad.DEPT_NAME END asc 
Verwandte Themen