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

Oracle10G SQL :Mengubah Kolom menjadi baris

Jika Anda menggunakan 11G, Anda dapat menggunakan unpivot :

SELECT subject, AVG(percentage) AS percentage
FROM (
    SELECT * FROM tablea
    UNPIVOT (percentage FOR subject IN (math, science, computer))
)
GROUP BY subject
ORDER BY subject;

SUBJECT  PERCENTAGE
-------- ----------
COMPUTER      94.33
MATH          91.33
SCIENCE       87.33

Tapi karena Anda tidak, Anda bisa memalsukannya. Diadaptasi dari situs ini :

SELECT subject, AVG(percentage) AS percentage
FROM (
    SELECT DECODE(unpivot_row, 1, 'Math',
                               2, 'Science',
                               3, 'Computer') AS subject,
           DECODE(unpivot_row, 1, math,
                               2, science,
                               3, computer) AS percentage
    FROM tablea
    CROSS JOIN (SELECT level AS unpivot_row FROM dual CONNECT BY level <= 3)
)
GROUP BY subject
ORDER BY subject;

SUBJECT  PERCENTAGE
-------- ----------
Computer      94.33
Math          91.33
Science       87.33

Dalam kedua kasus, bagian dalam select sedang mengubah baris menjadi kolom; dalam 10g Anda hanya perlu melakukannya sendiri. SELECT ... CONNECT BY ... hanya menghasilkan daftar nilai dummy, dan ini harus cukup untuk menutupi jumlah kolom yang Anda konversi menjadi baris (dan jika Anda benar-benar memiliki 1000, Anda harus benar-benar mengunjungi kembali model data). Kedua decode pernyataan menggunakan nomor yang dihasilkan untuk mencocokkan nama dan nilai kolom - jalankan pilihan dalam sendiri untuk melihat seperti apa.

Tanpa menggunakan SQL dinamis, Anda tidak bisa lepas dari keharusan membuat daftar kolom - hanya sekali dengan unpivot yang sebenarnya , tetapi dua kali dengan versi 10g palsu, dan Anda harus memastikan mereka cocok dengan benar, dan bahwa generator nomor baris menghasilkan nilai yang cukup. (Terlalu banyak dan Anda mungkin mendapatkan hasil yang aneh, tetapi karena nilai tambahan apa pun akan menjadi nol di sini dan Anda menggunakan avg , tidak terlalu penting dalam hal ini; hanya sebagai pemeriksaan kewarasan, Anda mungkin harus membuatnya sama persis).

Atau versi lain, berdasarkan Anda selalu menginginkan semua kolom kecuali name , yang berarti Anda hanya perlu membuat daftar kolom yang Anda inginkan sekali dan lebih mudah untuk mencocokkannya secara visual - terus tambahkan when klausa; dan Anda tidak perlu jumlah baris:

SELECT subject, AVG(percentage) AS percentage
FROM (
    SELECT column_name AS subject,
        CASE
            WHEN column_name = 'MATH' then math
            WHEN column_name = 'SCIENCE' then science
            WHEN column_name = 'COMPUTER' then computer
        END AS percentage
    FROM tablea
    CROSS JOIN (
        SELECT column_name
        FROM user_tab_columns
        WHERE table_name = 'TABLEA'
        AND column_name != 'NAME'
    )
)
GROUP BY subject
ORDER BY subject;

SUBJECT                        PERCENTAGE
------------------------------ ----------
COMPUTER                            94.33
MATH                                91.33
SCIENCE                             87.33



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pindahkan Nilai Non-NULL Ke Atas Dalam Partisi

  2. Bagaimana cara menampilkan proses yang berjalan di Oracle DB?

  3. Kebocoran Memori GetOracleDecimal

  4. Berapa batas ukuran untuk argumen subprogram varchar2 PL/SQL di Oracle?

  5. Masalah konversi Oracle SQL DATE menggunakan iBATIS melalui Java JDBC