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

oracle :Nama kolom dinamis

Karena Anda menggunakan Oracle10g, tidak ada PIVOT fungsi sehingga Anda harus melakukan jenis transformasi ini menggunakan fungsi agregat dengan CASE pernyataan.

Jika nilainya sudah diketahui sebelumnya, Anda dapat membuat kode keras dalam versi statis:

select s.ts_location,
  sum(case when p.tp_name = 'apple' then s.ts_sales else 0 end) Apple,
  sum(case when p.tp_name = 'mango' then s.ts_sales else 0 end) Mango,
  sum(case when p.tp_name = 'pineapple' then s.ts_sales else 0 end) Pineapple
from tbl_sales s
inner join tbl_products p
  on s.ts_tp_id = p.tp_id
group by s.ts_location

Lihat SQL Fiddle dengan Demo

Tetapi jika nilai Anda tidak diketahui sebelumnya, maka Anda harus mengimplementasikan sql dinamis dan di Oracle Anda akan ingin menggunakan prosedur untuk ini:

CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
    sql_query varchar2(1000) := 'select s.ts_location ';

    begin
        for x in (select distinct tp_name from tbl_products order by 1)
        loop
            sql_query := sql_query ||
                ' , sum(case when p.tp_name = '''||x.tp_name||''' then s.ts_sales end) as '||x.tp_name;

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from tbl_sales s 
                                                inner join tbl_products p
                                                  on s.ts_tp_id = p.tp_id
                                                group by s.ts_location';
        dbms_output.put_line(sql_query);

        open p_cursor for sql_query;
    end;
/

Kemudian untuk mengembalikan hasil yang dapat Anda gunakan (catatan: ini adalah bagaimana saya melakukannya di Toad):

variable x refcursor
exec dynamic_pivot(:x)
print x

Keduanya akan mengembalikan hasilnya:

| TS_LOCATION | APPLE | MANGO | PINEAPPLE |
-------------------------------------------
|          LN |     0 |    10 |        35 |
|          QL |    25 |     0 |        20 |
|          NY |   100 |     5 |        50 |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. karakter hingga saat ini di Oracle sql

  2. Mengizinkan login Oracle db hanya untuk aplikasi tertentu?

  3. Prosedur PL/SQL:Bagaimana mengembalikan pernyataan pilih?

  4. ODP.net Oracle Decimal Number masalah presisi saat mengisi dataset. Pengecualian:Operasi aritmatika menghasilkan overflow

  5. Excel ODBC Data Connection Query waktu yang dibutuhkan untuk me-refresh setiap query