SQL Server: GROUP BY với HAVING

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Mệnh đề GROUP BY dùng để phân nhóm tập kết quả thành một hoặc nhiều nhóm con. Mỗi nhóm con có giá trị và biểu thức chung.

GROUP BY là bắt buộc nếu có hàm tập hợp (aggregate) và một hoặc nhiều cột tham gia vào trong câu lệnh SELECT, và GROUP BY sẽ sinh ra một giá trị duy nhất cho mỗi tập hợp.

Cú pháp:

SELECT Các_cột, Hàm_tập_hợp FROM Các_bảng_liên_kết [WHERE Điều_kiện] GROUP BY  Các_cột,[Các_cột1] [ORDER BY ...];

Lưu ý rằng ở sau SELECT có Các_cột thì sau GROUP BY cũng phải có Các_cột, nghĩa là sau SELECT có những cột nào thì sau GROUP BY bắt buộc cũng phải có những cột đó.

Trong trường hợp cần thiết bạn có quyền đưa thêm Các_cột1 vào để việc phân nhóm cho tập kết quả được chính xác.

Ví dụ:

Tính tổng điểm của từng sinh viên:

SELECT studentname, SUM(mark) as N'Tổng điểm] FROM Student a JOIN Marks b on a.studentid=b.studentid GROUP BY  studentname,a.studentid ORDER BY SUM(mark) DESC;

Ở ví dụ trên, nếu không đưa thêm cột a.studentid vào thì kết quả có thể sẽ bị sai, bởi vì việc phân nhóm là theo cột studentname, tức là những sinh viên có họ và tên giống nhau sẽ được phân thành một nhóm, mà họ tên của những sinh viên khác nhau thì có thể trùng nhau, nên cần phải đưa thêm mã sinh viên vào việc phân nhóm để đảm bảo những sinh viên có cùng họ tên không bị xếp thành một nhóm.

Tính điểm trung bình cho từng sinh viên:

SELECT studentname, AVG(mark) as N'Trung bình cộng] FROM Student a JOIN Marks b on a.studentid=b.studentid GROUP BY  studentname,a.studentid;

HAVING

Trong trường hợp điều kiện có chứa hàm tập hợp thì ta không thể đặt điều kiện đó sau WHERE, thay vào đó ta sẽ đặt điều kiện đó ở sau HAVING.

Ví dụ như ý thứ 12 của bài tập Practical 4 ta có thể làm như sau:

select Ten,count(b.MaKhach)[Mua] from
  Customers a join CustomerItem b
  on a.MaKhach=b.MaKhach
 group by Ten,a.MaKhach
 having count(b.MaKhach)>1;

Lưu ý: Trong trường hợp câu lệnh truy vấn có chứa mệnh đề GROUP BY thì HAVING phải nằm sau mệnh đề này.

» Tiếp: CASE-WHEN
« Trước: ORDER BY
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!