Bạn có thể làm một cái gì đó như thế này. Tôi không có dữ liệu đầu vào của bạn, vì vậy tôi đã sử dụng SCOTT.EMP
thay vào đó.
Lưu ý một vài điều. Tôi đã nhóm theo JOB
và tôi đã sử dụng GROUPING(JOB)
cả trong SELECT
(để thêm nhãn TOTAL
cho hàng tóm tắt) và trong ORDER BY
. Vì tôi sử dụng lại tên cột JOB
trong SELECT
(đối với cột đầu ra), trong ORDER BY
Tôi phải cẩn thận để đủ điều kiện cho tên cột JOB
(để làm rõ hơn, tôi đang đề cập đến cột của bảng đầu vào, không phải cột trong SELECT
- sẽ là mặc định nếu tên cột trong ORDER BY
không đủ điều kiện). Sự cần thiết phải đủ điều kiện cho các tên cột trong ORDER BY
, sau đó, buộc tôi phải đặt bí danh cho bảng trong FROM
(nếu không, tôi đã phải mang đầy đủ tên bảng ở khắp mọi nơi).
Sử dụng GROUPING
chức năng trong SELECT
(chứ không phải NVL
) đặc biệt quan trọng nếu JOB
có thể là null
. Bạn không muốn nhóm cho null
công việc được gắn nhãn TOTAL
- bạn chỉ muốn điều đó cho hàng cuộn lên. Điểm này gây nhầm lẫn ngay cả với nhiều lập trình viên rất cao cấp.
Tôi chỉ cho bạn cách bạn có thể quyết định đơn hàng "theo cách thủ công":PRESIDENT
đầu tiên, sau đó đến MANAGER
, và sau đó là tất cả các công việc khác (được sắp xếp theo thứ tự bảng chữ cái). Nếu bạn có thứ tự ưu tiên được lưu ở đâu đó, chẳng hạn như trong một bảng, bạn có thể tham gia vào bảng đó và sử dụng cột thứ tự thay vì "thủ công" CASE
biểu thức trong truy vấn của tôi.
select case grouping(job) when 0 then job else 'TOTAL' end as job
, sum(sal) as total_salary
from scott.emp e
group by rollup(job)
order by grouping(e.job) -- to get the total in the last row
, case e.job when 'PRESIDENT' then 1 when 'MANAGER' then 2 end
, e.job
;
JOB TOTAL_SALARY
--------- ------------
PRESIDENT 5000
MANAGER 8275
ANALYST 6000
CLERK 4150
SALESMAN 5600
TOTAL 29025