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

Oracle SQL Transpose

Saya akan menyarankan untuk menerapkan fungsi UNPIVOT terlebih dahulu ke beberapa kolom Anda, kemudian menggunakan row_number() untuk membuat nama kolom baru Anda yang akan digunakan di PIVOT.

Sintaks dasar untuk unpivot adalah

select field, 
  value,
  'value'||
   to_char(row_number() over(partition by field
                              order by value)) seq
from yourtable
unpivot
(
  value
  for field in (Name, Age, Sex, DOB, col1, col2, col3)
) u;

Lihat SQL Fiddle dengan Demo . Ini akan mengubah beberapa kolom data Anda menjadi beberapa baris. Saya menggunakan row_number() untuk membuat nilai unik untuk nama kolom baru Anda, data dari kueri ini terlihat seperti:

| FIELD |                   VALUE |    SEQ |
|-------|-------------------------|--------|
|   AGE |                      12 | value1 |
|   AGE |                      15 | value2 |
|  COL1 |                      aa | value1 |
|  COL1 |                      xx | value2 |

Kemudian Anda dapat menerapkan fungsi PIVOT ke hasil ini:

select field, value1, value2
from
(
  select field, 
    value,
    'value'||
      to_char(row_number() over(partition by field
                                order by value)) seq
  from yourtable
  unpivot
  (
    value
    for field in (Name, Age, Sex, DOB, col1, col2, col3)
  ) u
) d
pivot
(
  max(value)
  for seq in ('value1' as value1, 'value2' as value2)
) piv

Lihat SQL Fiddle dengan Demo . Ini memberikan hasil akhir:

| FIELD |                  VALUE1 |                  VALUE2 |
|-------|-------------------------|-------------------------|
|   AGE |                      12 |                      15 |
|  COL1 |                      aa |                      xx |
|  COL2 |                      bb |                      yy |
|  COL3 |                      cc |                      zz |
|   DOB | 07-Aug-2001 12:00:00 AM | 26-Aug-2001 12:00:00 AM |
|  NAME |                       A |                       B |
|   SEX |                       F |                       M |

Catatan, saat Anda menerapkan fungsi unpivot, tipe data dari semua kolom harus sama sehingga Anda mungkin harus mengonversi data dalam subkueri sebelum Anda dapat melepasnya.

Fungsi UNPIVOT/PIVOT diperkenalkan di Oracle 11g, jika Anda menggunakan Oracle 10g, maka Anda dapat mengedit kueri untuk menggunakan:

with cte as
(
  select 'name' field, name value
  from yourtable
  union all
  select 'Age' field, Age value
  from yourtable
  union all
  select 'Sex' field, Sex value
  from yourtable
  union all
  select 'DOB' field, DOB value
  from yourtable
  union all
  select 'col1' field, col1 value
  from yourtable
  union all
  select 'col2' field, col2 value
  from yourtable
  union all
  select 'col3' field, col3 value
  from yourtable
)
select
  field,
  max(case when seq = 'value1' then value end) value1,
  max(case when seq = 'value2' then value end) value2
from
(
  select field, value,
  'value'||
      to_char(row_number() over(partition by field
                                order by value)) seq
  from cte
) d
group by field;

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. Nama ORA-00955 sudah digunakan oleh objek yang ada

  2. ORA-00933:Perintah SQL tidak diakhiri dengan benar saat memasukkan beberapa baris

  3. Memperkirakan waktu pembuatan indeks di Oracle

  4. Oracle - perbarui tabel yang sama tempat pemicu diaktifkan

  5. Oracle SQL - Mengubah baris menjadi kolom secara dinamis