2017-03-13 33 views
0

我在MySQL中發現一個問題我在嘗試。請告訴我下面的解決方案是否可以工作,或者有更好的解決方案嗎?部門名稱和學生人數

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 

學生表具有以下字段:

Student_ID 
Student_Name 
Gender 
Dept_ID 

部門表具有以下字段:

Dept_ID 
Dept_Name 

甲大學使用2數據表,學生和部門, 存儲關於數據的學生和與每個專業相關的部門。

  • 編寫一個查詢,打印相應的部門名稱和(甚至是那些沒有在校學生)的學生 每個部門的專業在Departments表 各部門的數量。

  • 按照學號下降的學校排序你的結果;如果兩個或更多部門的學生數量相同,則按部門名稱的字母順序對這些部門進行排序。

+1

可能的問題是'COUNT(*)'。如果部門沒有學生,它會返回什麼?我想這將是1,因爲該部門有一條線。 –

+0

我是對的,請參閱http://sqlfiddle.com/#!15/39a8b/1/0 - 2個部門(數學和物理)沒有學生,您的查詢顯示爲他們計數1。 –

+0

@ marek.jancuska你能告訴我哪個SQL查詢可以工作嗎? – SolakiR

回答

1

您需要一種方法在每個部門計數的學生,那麼你需要一種方法來列出所有部門,甚至那些沒有學生。

學生票在各部門:(http://sqlfiddle.com/#!15/39a8b/15/0

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

然後,治療,作爲一個子查詢,離開它加入到您的其他表。 (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 

的LEFT JOIN保留在部門表中的行不與ON條款相匹配。這讓你像這樣。

Biology   7 
    Mathematics (NULL) 
    Sociology  11 
    Physics   3 

因此你必須處理那個(NULL)問題。就是這樣。更改SELECT說

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

這是一個有點棘手加入一個表的集合,其中骨料(計數/ GROUP BY查詢)已經丟失的數據。但這就是你如何去做的。

你可以自己計算出ORDER BY的東西。

2

請原諒我改變代碼的格式。

我會改變ORDER BY,如下:

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。

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 
相關問題