使用多個表分組多列

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 BYJOIN 語句一起使用:

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