Pivot dengan Plain-SQL

Soeleman 30 Januari 2017

Pivot dengan Plain-SQL

Membuat tabulasi data dari row yang dijadikan column yang biasa kita sebut PIVOT dengan database termutakhir adalah jauh lebih mudah. Dengan banyaknya fungsi-fungsi yang sudah build-in di versi tersebut.

Alangkah indahnya apabila kita bisa terus meng-upgrade database. Realitanya tidak seperti itu, dari masalah biaya, teknikal atau resiko bila melakukan itu.

Dan permintaan penguna aplikasi untuk mendapatkan data yang dibutuhkan harus kita bisa penuhi. Di tulisan ini kita coba menyelesaikan dengan hanya menggunakan fungsi SQL Standard saja.

Table

Agar memudahkan kita mesimulasikannya, kita buat sebuah table.

Table Piv2K

Kita buat table Piv2K dengan data-data seperti di bawah. Ada 15 row dengan 3 column.

alt text

Target

Dan yang hasil resultset yang ingin dihasilkan adalah seperti di bawah. Dalam data di atas, column NoJual memiliki data NoBayar dan NilaiBayar sebagai child-nya. Oleh karena itu kita mengelompokkan column NoJual dan memindahkan row data NilaiBayar menjadi column.

alt text

SQL Server

Di kasus ini kita diharapkan membuat PIVOT dengan SQL Server 2000, yang notabene ini adalah sudah jauh tertinggal dibandingkan dengan versi terakhir.

Sebelum kita menyelesaikan dengan versi jadul itu. kita coba lihat bagaimana kita menyelesaikan permintaan ini dengan fungsi yang ada di versi terbaru dahulu.

Pivot

Seperti yang sudah sebutkan, membuat PIVOT adalah lebih mudah dengan bantuan fitur build-in. Terlebih kita juga memerlukan fungsi ROW_NUMBER untuk men-sort dan memberikan nomor urutan berdasarkan column NoBayar. Maka seperti terlihat pada query di bawah, kita merangkai kedua fungsi tersebut untuk menyelesaikan tugas ini.

alt text

Plain-SQL

Pada SQL Server 2000 fungsi yang mempermudahkan pekerjaan kita itu tidak ada. Jadi yang kita bisa lakukan adalah mesimulasikan fungsi di atas dengan hanya mengandalkan Standard SQL saja.

PIVOT kita bisa buat dengan mengandalkan SUM dan CASE lalu di-GROUP BY. Sedangkan untuk ROW_NUMBER kita bisa menggunakan COUNT di dalam Sub Query.

alt text

MySQL

Semakin kita menggunakan fungsi tidak spesifik dalam SQL kita, maka boleh di bilang semakin portable query tersebut. Dengan sedikit sekali penyesuaian pada SUBSTRING dan CAST-nya, kita bisa memindahkan query diatas ke dalam MySQL.

alt text

Dan tentu saja hasilnya sama seperti yang diperkirakan.

alt text

Penutup

Bekerja dengan database versi lawas memang banyak keterbatasan. Karena bagaimanapun perkembangan fungsi yang ada di dalam database berikutnya dihasilkan oleh feedback dari penggunanya pada saat itu.

Walaupun sampai saat ini MySQL belum mem-support PIVOT atau ROW_NUMBER, kita bisa mencapai tujuan dengan fungsi yang ada. Yang penting adalah bagaimana mengexpresikan buah pikiran kita secara tepat dengan tata cara yang diperbolehkan oleh SQL di database yang digunakan.

Referensi

Perhatian! Code yang ditampilkan dalam tulisan ini merupakan ilustrasi dari yang ingin dipaparkan dan bukan production ready code.
Sudah banyak kejadian karena asal meng-copy-and-paste tanpa mengerti code yang diambil itu ke dalam production.
Selain itu perlu ada tambahan code dan test sebelum siap untuk di gunakan secara utuh.