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

Putar di Oracle 10g

Di Oracle 10g, tidak ada PIVOT fungsi tetapi Anda dapat mereplikasinya menggunakan agregat dengan CASE :

select usr,
  sum(case when tp ='T1' then cnt else 0 end) T1,
  sum(case when tp ='T2' then cnt else 0 end) T2,
  sum(case when tp ='T3' then cnt else 0 end) T3
from temp
group by usr;

Lihat SQL Fiddle dengan Demo

Jika Anda memiliki Oracle 11g+ maka Anda dapat menggunakan PIVOT fungsi:

select *
from temp
pivot
(
  sum(cnt)
  for tp in ('T1', 'T2', 'T3')
) piv

Lihat SQL Fiddle dengan Demo

Jika Anda memiliki jumlah nilai yang tidak diketahui untuk diubah, Anda dapat membuat prosedur untuk menghasilkan versi dinamis ini:

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

    begin
        for x in (select distinct tp from temp order by 1)
        loop
            sql_query := sql_query ||
              ' , sum(case when tp = '''||x.tp||''' then cnt else 0 end) as '||x.tp;

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from temp group by usr';

        open p_cursor for sql_query;
    end;
/

kemudian untuk mengeksekusi kode:

variable x refcursor
exec dynamic_pivot(:x)
print x

Hasil untuk semua versi sama:

| USR | T1 | T2 | T3 |
----------------------
|   1 | 17 |  0 |  0 |
|   2 |  0 | 21 |  1 |
|   3 | 45 |  0 |  0 |

Sunting:Berdasarkan komentar Anda jika Anda menginginkan Total bidang, cara termudah adalah menempatkan kueri di dalam SELECT another yang lain mirip dengan ini:

select usr,
  T1 + T2 + T3 as Total,
  T1,
  T2,
  T3
from
(
  select usr,
    sum(case when tp ='T1' then cnt else 0 end) T1,
    sum(case when tp ='T2' then cnt else 0 end) T2,
    sum(case when tp ='T3' then cnt else 0 end) T3
  from temp
  group by usr
) src;

Lihat SQL Fiddle dengan Demo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara memeriksa NLS_LANG klien?

  2. Periksa apakah tanggal saat ini berada di antara dua tanggal Oracle SQL

  3. PLSQL :BARU dan :LAMA

  4. ORA-01438:nilai lebih besar dari presisi yang ditentukan yang diizinkan untuk kolom ini saat memasukkan 3

  5. Kesalahan:PLS-00428:klausa into diharapkan dalam pernyataan pilih ini