Jadual Pangsi Dinamik Oracle SQL: Menghadapi Perubahan Nilai
Mengendalikan nilai dinamik dalam IN
pernyataan boleh menjadi rumit apabila menggunakan fungsi PIVOT dalam Oracle SQL. Artikel ini menyediakan penyelesaian.
PIVOT Oracle biasanya memerlukan penggunaan rentetan nilai statik dalam pernyataan IN
, contohnya:
<code class="language-sql">... pivot (sum(A) for B in (X)) </code>
Walau bagaimanapun, jika nilai B disimpan dalam lajur pangkalan data dan dikemas kini dengan kerap, mengemas kini rentetan X secara manual menjadi tidak praktikal.
Untuk menyelesaikan masalah ini, kita boleh menggunakan helah yang melibatkan mencipta rentetan IN
dan kemudian menggunakannya dalam pertanyaan PIVOT. Mari kita pecahkan:
Langkah 1: Bina rentetan IN
Untuk mencipta rentetan, kami menggunakan fungsi COLUMN NEW_VALUE
dan LISTAGG
seperti berikut:
<code class="language-sql">COLUMN temp_in_statement new_value str_in_statement SELECT DISTINCT LISTAGG('''' || myLetter || ''' AS ' || myLetter,',') WITHIN GROUP (ORDER BY myLetter) AS temp_in_statement FROM (SELECT DISTINCT myLetter FROM myTable);</code>
Pertanyaan ini membina rentetan yang serupa dengan:
<code>'A' AS A,'B' AS B,'C' AS C</code>
Langkah 2: Menggunakan rentetan dalam PIVOT
Kini kami boleh menambah rentetan ini pada pertanyaan PIVOT kami:
<code class="language-sql">SELECT * FROM (SELECT myNumber, myLetter, myValue FROM myTable) PIVOT (Sum(myValue) AS val FOR myLetter IN (&str_in_statement));</code>
Sekatan:
Walaupun kaedah ini menyediakan penyelesaian, kaedah ini mempunyai had: panjang maksimum rentetan sambungan ialah 4000 bait. Oleh itu, kaedah ini mungkin tidak sesuai jika bilangan nilai B sangat besar.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Pivot Dinamik dalam Oracle SQL dengan Nilai Berbeza-beza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!