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

Oracle SQL - pernyataan kasus dinamis

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:

  1. Buat kueri PIVOT dengan kolom bernama dalam fungsi PL/SQL;
  2. Jalankan kueri dari klien Anda.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pemetaan Hibernate - Menggabungkan dua tabel dengan tabel asosiasi - Tetapi dengan twist

  2. Menghubungkan ke Oracle:CodeIgniter vs Laravel

  3. Alamat IP disimpan sebagai desimal - PL/SQL untuk ditampilkan sebagai quad bertitik

  4. Mengelompokkan catatan jam demi jam atau hari demi hari dan mengisi celah dengan nol atau nol

  5. Membuat pemicu yang melempar pengecualian pada sisipan