Anda memerlukan fungsi PIVOT dengan definisi kolom dinamis. Cara paling sederhana adalah pivot xml:
create table tst_data (id int primary key, source varchar2(255));
insert into tst_data values (1, 'INTERNET');
insert into tst_data values (2, 'DEMO');
insert into tst_data values (3, 'INTERNET');
insert into tst_data values (4, 'SALES');
insert into tst_data values (5, 'INTERNET');
insert into tst_data values (6, 'DEMO');
insert into tst_data values (7, 'INTERNET');
insert into tst_data values (8, 'COM');
commit;
select * from (
select source from tst_data
)
pivot xml
(
count(1)
for source in (select distinct t.source from tst_data t)
)
Setelah Anda perlu memproses data XML:
<PivotSet>
<item>
<column name = "SOURCE">COM</column>
<column name = "COUNT(1)">1</column>
</item>
<item>
<column name = "SOURCE">DEMO</column>
<column name = "COUNT(1)">2</column>
</item>
<item>
<column name = "SOURCE">INTERNET</column>
<column name = "COUNT(1)">4</column>
</item>
<item>
<column name = "SOURCE">SALES</column>
<column name = "COUNT(1)">1</column>
</item>
</PivotSet>
PIVOT XML
mendukung definisi kolom dinamis (for source in (select distinct t.source from tst_data t)
) namun mengembalikan data XML. Extractvalue
dan xmltable
fungsi memungkinkan untuk menanyakan kolom tertentu dari XML di sisi server tetapi Anda harus menentukan nama bidang terlebih dahulu. Jadi saya berasumsi untuk menguraikannya di sisi klien.
Jika Anda ingin melakukan semuanya pada DB-layer ada pendekatan lain. PIVOT
(bukan XML) memerlukan nama kolom for source in ('INTERNET', 'DEMO', 'COM', ...)
. Dimungkinkan untuk membuat kueri seperti itu dan mengembalikan kursor ke sisi klien:
CREATE OR REPLACE FUNCTION FUNCTION1 RETURN SYS_REFCURSOR AS
cur sys_refcursor;
BEGIN
open cur for 'select * from dual'; // generate PIVOT query here
RETURN cur;
END FUNCTION1;
Saya tidak tahu metode apa pun untuk membuat kueri sederhana yang tidak diketik dari kursor (di sisi server), jadi jika Anda ingin menggunakan kueri SQL biasa, lakukan dalam dua langkah:
- Buat kueri PIVOT dengan kolom bernama dalam fungsi PL/SQL;
- Jalankan kueri dari klien Anda.