Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

hai cột Pivoting trong Oracle SQL

Đố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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách gọi func helloword mẫu bằng mã java

  2. Truy xuất các phần tử XML từ XMLType Oracle

  3. (+) Làm gì trong Oracle SQL?

  4. Tùy chọn định dạng SQLcl (Oracle)

  5. Xóa ký tự cuối cùng khỏi chuỗi trong sql plus