Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

dua kolom Berputar di Oracle SQL

Untuk jumlah pasangan nilai yang ditentukan dalam kolom tname, ttype anda dapat menggunakan kueri di bawah ini (perhatikan bahwa saya mengubah nama kolom Anda dari contoh, karena Anda menggunakan kata kunci Oracle di sana, saya juga menamai tabel sebagai tasks , jadi Anda harus mengubah data ini menjadi nama kolom dan nama tabel asli Anda di mana saja dalam kode) :

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)));

Untuk sejumlah kemungkinan dinamis, Anda memerlukan beberapa prosedur "membuat" kueri ini. Di sini saya menggunakan view untuk kode prosedur ini. Salin dan kompilasi. Ketika data dalam tabel Anda berubah, Anda harus menjalankan prosedur terlebih dahulu, lalu cukup memilih dari tampilan yang dibuat oleh prosedur. Agar dapat berjalan dengan baik, skema Anda memerlukan hak istimewa untuk membuat tampilan yang diberikan.

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

Tentu saja Anda dapat mengubah urutan baris dan kolom sesuai keinginan dengan menambahkan atau mengubah order by bagian dalam kode prosedur:

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;

Saya percaya ada juga solusi yang lebih universal untuk pertanyaan Anda di tautan yang saya berikan kepada Anda di komentar:Pivoting SQL Dinamis... . Kelihatannya sangat menjanjikan, cukup baca dengan seksama bagian Sumber Daya di bagian bawah, dan ikuti langkah-langkah instruksi. Saya tidak memeriksa metode ini secara pribadi, tetapi mungkin ini lebih cocok untuk Anda daripada solusi "tampilan prosedur" saya.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bergabunglah dengan dua tabel ketika tidak ada nilai dalam satu tabel

  2. Urutan evaluasi klausa Oracle SQL

  3. Prosedur tersimpan Oracle, mengembalikan kursor ref vs array asosiatif

  4. Pemetaan Hibernate - Menggabungkan dua tabel dengan tabel asosiasi - Tetapi dengan twist

  5. Bagaimana cara memanggil prosedur pengembalian Oracle CURSOR di java