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.