Đối với số cặp giá trị được xác định trong các cột tname, ttype
bạn có thể sử dụng truy vấn bên dưới (lưu ý rằng tôi đã thay đổi tên cột của bạn từ ví dụ, vì bạn đã sử dụng từ khóa Oracle ở đó, tôi cũng đặt tên bảng là tasks
, vì vậy bạn sẽ phải thay đổi dữ liệu này thành tên cột thực và tên bảng ở mọi nơi trong mã):
select * from tasks
pivot (max(tdate) for (tname, ttype) in
(('DG1','CF') DG1_CF, ('M0','A') M0_A, ('M0','POR') M0_POR,
('M1','A' ) M1_A, ('M1','CF') M1_CF, ('M2','A') M2_A)));
Đối với số khả năng động, bạn sẽ cần một số thủ tục "tạo" truy vấn này. Ở đây tôi đã sử dụng view
cho điều này. Sao chép mã thủ tục và biên dịch nó. Khi dữ liệu trong bảng của bạn thay đổi, trước tiên bạn phải chạy thủ tục, sau đó chỉ cần chọn từ chế độ xem được tạo bởi thủ tục.
execute create_tasks_view;
select * from v_tasks;
anonymous block completed
ID DG1_CF M0_A M0_POR M1_A M1_CF M2_A
----- ---------- ---------- ---------- ---------- ---------- ----------
45000 2015-03-02 2015-02-01 2015-03-11 2015-02-03 2015-03-01 2015-02-04
44400 2015-02-02 2015-01-01 2015-02-11 2015-01-03 2015-02-01 2015-01-04
Tất nhiên, bạn có thể thay đổi thứ tự các hàng và cột theo ý muốn bằng cách thêm hoặc sửa đổi order by
các phần trong mã thủ tục:
create or replace procedure create_tasks_view as
v_sql varchar2(32767) := '';
begin
for v in (select distinct tname, ttype from tasks order by tname, ttype)
loop
v_sql := v_sql || '(''' || v.tname || ''',''' || v.ttype || ''') '
||v.tname||'_'||v.ttype||',';
end loop;
v_sql := 'create or replace view v_tasks as '
||'select * from tasks pivot (max(tdate) for (tname, ttype) in ('
||rtrim(v_sql, ', ')||'))';
execute immediate v_sql;
end create_tasks_view;
Tôi tin rằng cũng có một giải pháp phổ quát hơn cho câu hỏi của bạn trong liên kết mà tôi đã đưa ra cho bạn trong phần nhận xét: Dynamic SQL Pivoting ... . Có vẻ rất hứa hẹn, chỉ cần đọc kỹ phần Tài nguyên ở dưới cùng và làm theo các bước hướng dẫn. Tôi đã không kiểm tra phương pháp này một cách cá nhân, nhưng có thể điều này sẽ phù hợp với bạn hơn là giải pháp "chế độ xem thủ tục" của tôi.