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