06/04/2021, 14:51

Gộp kết quả với lệnh Group By trong Oracle - Oracle căn bản

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ú ...

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.

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:

groupby3 png

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:

groupby4 png

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:

groupby5 png

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:

groupby6 png

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:

groupby7 png

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é.

Trần Trung Dũng

15 chủ đề

2610 bài viết

Cùng chủ đề
0