Saya memiliki contoh SQL Server yang memiliki server yang terhubung ke server Oracle. Ada tabel di server Oracle yang disebut PersonOptionsyang berisi data berikut:
╔══════════╦══════════╗
║ PersonID ║ OptionID ║
╠══════════╬══════════╣
║ 1 ║ A ║
║ 1 ║ B ║
║ 2 ║ C ║
║ 3 ║ B ║
║ 4 ║ A ║
║ 4 ║ C ║
╚══════════╩══════════╝
Saya perlu menggerakkan data itu sehingga hasilnya adalah:
Ada beberapa cara untuk melakukan transformasi data ini. Anda memiliki akses ke PIVOTfungsi maka itu akan menjadi yang termudah, tetapi jika tidak maka Anda dapat menggunakan fungsi agregat dan a CASE.
Dua versi di atas berfungsi dengan baik jika Anda memiliki jumlah nilai yang diketahui, tetapi jika nilai Anda tidak diketahui, maka Anda ingin mengimplementasikan sql dinamis dan di Oracle Anda dapat menggunakan prosedur:
CREATEOR REPLACE procedure dynamic_pivot_po(p_cursor in out sys_refcursor)as
sql_query varchar2(1000):='select personid ';beginfor x in(selectdistinct OptionID from PersonOptions orderby1)
loop
sql_query := sql_query ||' , min(case when OptionID = '''||x.OptionID||''' then 1 else null end) as Option_'||x.OptionID;
dbms_output.put_line(sql_query);end loop;
sql_query := sql_query ||' from PersonOptions group by personid order by personid';
dbms_output.put_line(sql_query);open p_cursor for sql_query;end;/
Kemudian Anda mengembalikan hasilnya, Anda akan menggunakan:
variable x refcursorexec dynamic_pivot_po(:x)print x
Namun solusi Static Pivot mengasumsikan hanya ada tiga opsi. Bagaimana jika Anda memiliki jumlah opsi yang berpotensi tidak terbatas? ABCDEFGHIJK misalnya? Apakah tidak ada cara untuk membuat pivot dinamis dengan sql reguler? Alih-alih membuat opsi header kolom, bisakah kita menempatkannya di kolom? Jadi akan terlihat seperti ini: | ORANG | Kolom2 | Kolom3 | Kolom4 | ------------------------------------------ | 1 | A | B | null | | 2 | C | null | null | | 3 | null | C | null |
Matius
1
@ Matius Anda harus menggunakan Dynamic Sql seperti yang saya tunjukkan di bagian terakhir dari jawaban.
Taryn
Terima kasih atas tanggapan cepatnya! Saya benar-benar melakukan ini dengan membuat kolom baru, dan memasukkan semua opsi di sana dipisahkan dengan koma. Kol dihasilkan dari pemilihan subquery dari tabel yang sama where a.personId = a2.personId order by a2.personId for xml path(''). a2 adalah tabel dalam subquery. Kemudian saya memisahkan data dalam excel menggunakan teks ke kolom dengan koma sebagai pembatas. Saya berharap menemukan cara untuk melakukan ini dalam sql biasa tanpa harus menulis prosedur, tetapi mungkin tidak ada cara. Harus menjalankan saat ini tetapi saya akan mencoba memposting contoh itu untuk lebih menjelaskan.
Matius
9
Ini akan menjadi setara dalam sintaks SQL Server. Berdasarkan bacaan saya tentang dokumen Oracle, NULLIF dan PIVOT tampaknya memiliki format yang sama dengan kerabat SQL Server mereka. Tantangannya adalah daftar pivot yang harus statis kecuali jika Anda membuat kueri dinamis seperti yang ditunjukkan oleh Itzik, tetapi saya tidak tahu apakah itu dapat diterjemahkan ke P / SQL
Jangan ragu untuk menjelaskan yang ini sedikit lagi. Apa yang disediakan pivot yang mungkin tidak dimiliki orang lain? Dan kapan itu rusak? Ingat Anda menjawab untuk anak cucu, bukan untuk seseorang dengan keahlian domain spesifik dalam hal-hal yang Anda ketahui juga.
jcolebrand
2
@ jcolebrand: Ini lebih tentang preferensi pribadi - Saya sendiri berpikir bahwa PIVOTsintaks lebih berbelit-belit dibandingkan dengan pendekatan yang saya gunakan. Namun, saya sadar keduanya memberikan hasil yang sama, dan saya setuju orang lain mungkin berpikir sebaliknya.
a1ex07
1
Petunjuk: Gunakan tombol edit ;-) ~ Kami ingin mendorong lebih dari sekadar respons kode jawaban.
where a.personId = a2.personId order by a2.personId for xml path('')
. a2 adalah tabel dalam subquery. Kemudian saya memisahkan data dalam excel menggunakan teks ke kolom dengan koma sebagai pembatas. Saya berharap menemukan cara untuk melakukan ini dalam sql biasa tanpa harus menulis prosedur, tetapi mungkin tidak ada cara. Harus menjalankan saat ini tetapi saya akan mencoba memposting contoh itu untuk lebih menjelaskan.Ini akan menjadi setara dalam sintaks SQL Server. Berdasarkan bacaan saya tentang dokumen Oracle, NULLIF dan PIVOT tampaknya memiliki format yang sama dengan kerabat SQL Server mereka. Tantangannya adalah daftar pivot yang harus statis kecuali jika Anda membuat kueri dinamis seperti yang ditunjukkan oleh Itzik, tetapi saya tidak tahu apakah itu dapat diterjemahkan ke P / SQL
sumber
Saya lebih memilih untuk memutar permintaan secara manual, tetapi Anda juga dapat menggunakannya
PIVOT
.sumber
PIVOT
sintaks lebih berbelit-belit dibandingkan dengan pendekatan yang saya gunakan. Namun, saya sadar keduanya memberikan hasil yang sama, dan saya setuju orang lain mungkin berpikir sebaliknya.