使用多個表分組多列
Group by 經常與 join 語句一起使用。我們假設我們有兩個表。第一個是學生表:
ID |
全名 | 年齡 |
---|---|---|
1 |
馬特瓊斯 | 20 |
2 |
弗蘭克藍 | 21 |
3 |
安東尼天使 | 18 |
第二張表是每個學生可以參加的主題表:
Subject_Id | 學科 |
---|---|
1 |
數學 |
2 |
PE |
3 |
物理 |
因為一個學生可以參加很多科目,一個科目可以由很多學生參加(因此 N:N 關係),我們需要有第三個邊界表。我們稱之為 Students_subjects:
Subject_Id | 學生卡 |
---|---|
1 |
1 |
2 |
2 |
2 |
1 |
3 |
2 |
1 |
3 |
1 |
1 |
現在讓我們說我們想知道每個學生參加的科目數量。這裡獨立的 GROUP BY
語句是不夠的,因為資訊不能通過單個表獲得。因此我們需要將 GROUP BY
與 JOIN
語句一起使用:
Select Students.FullName, COUNT(Subject Id) as SubjectNumber FROM Students_Subjects
LEFT JOIN Students
ON Students_Subjects.Student_id = Students.Id
GROUP BY Students.FullName
給定查詢的結果如下:
全名 | SubjectNumber |
---|---|
馬特瓊斯 | 3 |
弗蘭克藍 | 2 |
安東尼天使 | 1 |
對於更復雜的 GROUP BY 使用示例,假設學生可能能夠多次為同一主題分配相同的主題(如表 Students_Subjects 所示)。在這種情況下,我們可以通過 GROUPing 按多列來計算每個主題分配給學生的次數:
SELECT Students.FullName, Subjects.Subject,
COUNT(Students_subjects.Subject_id) AS NumberOfOrders
FROM ((Students_Subjects
INNER JOIN Students
ON Students_Subjcets.Student_id=Students.Id)
INNER JOIN Subjects
ON Students_Subjects.Subject_id=Subjects.Subject_id)
GROUP BY Fullname,Subject
此查詢提供以下結果:
全名 | 學科 | SubjectNumber |
---|---|---|
馬特瓊斯 | 數學 | 2 |
馬特瓊斯 | PE | 1 |
弗蘭克藍 | PE | 1 |
弗蘭克藍 | 物理 | 1 |
安東尼天使 | 數學 | 1 |