Gộp kết quả với lệnh Group By trong Oracle
Trong Oracle, lệnh Group By dùng kết hợp với lệnh SELECT để lấy dữ liệu, sau đó gộp dữ liệu lại theo một cột hoặc nhiều cột. Giống như lệnh DISTINCT, lệnh GROUP BY sẽ gộp dữ liệu trùng, tuy nhiên nó chỉ gộp dựa vào columns mà ta đã khai báo.
1. Cú pháp lệnh Group By trong Oracle
Sau đây là cú pháp của lệnh Group By trong Oracle.
SELECT column1, column2, column3, ... FROM tables WHERE conditions GROUP BY column1, column2, column3, ...
Như vậy Group By sẽ đặt cuối cùng trong lệnh SELECT.
Có một lưu ý quan trọng, đó là các cột mà bạn muốn group by
bắt buộc phải có trong select
, bởi vì theo quy luật chạy thì bạn không select thì ở group by không có dữ liệu để gom nhóm.
Bài viết này được đăng tại [free tuts .net]
Ví dụ: ở group by mình có group theo name
, city
nên select phải có chọn cái đó.
SELECT city, name, SUM(sale) AS "Total sales" FROM salesdepartment GROUP BY city, name;
Khi sử dụng lệnh group by, nếu bạn sử dụng các hàm như SUM, COUNT ở các column có group by thì kết quả trả về là toàn bộ các records ở dạng gộp lại. Ví dụ hàm SUM thì trả về tổng tất cả giá trị các record, COUNT thì đêm số record.
2. Sử dụng Group By với hàm COUNT trong Oracle
Sau đây là một vài ví dụ, bạn hãy thực hành để hiểu rõ nó hơn nhé, vì đây là lệnh rất khó hiểu với những bạn mới học.
Trước tiên mình sẽ tạo một bảng CUSTOMERS bằng lệnh sau:
CREATE TABLE "CUSTOMERS" ( "NAME" VARCHAR2(4000), "AGE" NUMBER, "SALARY" NUMBER, "STATE" VARCHAR2(4000) )
Và mình đã thêm một số dữ liệu như sau:
Yêu cầu: Bây giờ mình muốn đếm tổng khách hàng của mỗi state có mức lương lớn hơn 1000.
Theo như yêu cầu thì kết quả sẽ trả về dạng như sau:
Như vậy ta sẽ group by theo state, và mỗi state sẽ đếm có bao nhiêu record, số record đó chính là tổng số khách hàng của state đó.
SELECT state, COUNT(*) AS "Number of customers" FROM customers WHERE salary > 10000 GROUP BY state;
3. Sử dụng Group By với hàm MIN/MAX trong Oracle
Mình sẽ đưa ra một ví dụ nữa để bạn tham khảo.
Giả sử mình có bảng employees như sau:
CREATE TABLE "EMPLOYEES" ( "EMP_ID" NUMBER, "NAME" VARCHAR2(4000), "AGE" NUMBER, "DEPARTMENT" VARCHAR2(4000), "SALARY" NUMBER )
Và đây là dữ liệu mẫu:
Bây giờ mình muốn lấy nhân viên có mức lương nhỏ nhất của từng phòng ban. Như vậy mình sẽ group by theo department và dùng hàm MIN tại salary ở lệnh select, hàm MIN sẽ chọn ra record có mức lương thấp nhất.
SELECT department, MIN(salary) AS "Lowest salary" FROM employees GROUP BY department;
Kết quả như sau:
Nếu bạn muốn chọn mức lương lớn nhất thì thay hàm MIN bằng hàm MAX.
SELECT department, MAX(salary) AS "Highest salary" FROM employees GROUP BY department;
Kết quả như sau:
4. Lời kết
Như vậy là mình đã giới thiệu xong lệnh Group by trong Oracle, đây là lệnh tương đối hay vì nó giúp bạn thống kê truy vấn khá tốt. Hy vọng bạn thực hành nhuần nhuyễn với lệnh này, nếu không bạn sẽ không thể đi làm được đâu nhé.