PendahuluanPada beberapa laporan / report summary kita kebutuhan untuk dapat menghasilkan top N dari tiap grouping sangatlah penting dan sering sekali jadi tuntutan manajemen / direksi.
Sebagai contoh, misalkan pada suatu perusahaan kendaraan multi nasional ingin melihat laporan nilai penjualan 3 teratas dari produk dengan pengelompokan tiap negara pada periode tertentu.
Bagi Anda yang sudah mengenal MDX tentunya solusi ini sangat gampang, yaitu menggunakan function generate dan topcount seperti terlihat pada contoh artikel pada link ini.
Bagaimana kalau kita menerapkannya pada MySQL ? Dengan penggunaan variable dan subquery artikel berikut akan memberikan solusi tersebut.
Tahap Pertama : Menentukan Grouping Yang DiinginkanTentunya pertama kita ingin menentukan grouping dan nilai aggregate yang kita inginkan, setelah mendapatkan query tersebut kita akan menjadikannya sebagai subset yang akan kita query lagi.
Sebagai contoh dari database PHI-Minimart, kita akan melakukan perhitungan jumlah unit produk yang dibeli oleh pengunjung dari tiap cabang dan diurutkan dari nilai terbesar ke terkecil dengan query berikut :
SELECT kode_produk, kode_cabang, SUM(jumlah_pembelian) AS jumlah_beli
FROM tr_penjualan GROUP BY kode_cabang, kode_produk ORDER BY kode_cabang, jumlah_beli DESC Hasil Eksekusi akan terlihat sebagai berikut... dengan beberapa row dibuang untuk mempersingkat penulisan.
![]() Tahap Kedua : Variable dan SubqueryQuery yang telah kita putuskan di atas akan kita masukkan sebagai subquery, dan dari hasil tersebut kita mengambil nilai informasi iterasi (penomoran) - seperti yang ditunjukkan pada artikel Penggunaan Variable di MySQL.
Variable yang kita gunakan harus memiliki fungsi berikut :
Konstruksi query baru kita adalah sebagai berikut :
SELECT T1.*,
CASE WHEN @grouping != T1.kode_cabang THEN @nomorbaris := 1 ELSE @nomorbaris := @nomorbaris + 1 END AS nomorbaris, CASE WHEN @grouping != T1.kode_cabang THEN @grouping := T1.kode_cabang ELSE @grouping END AS Grouping FROM ( SELECT kode_produk, kode_cabang, SUM(jumlah_pembelian) AS jumlah_beli FROM tr_penjualan GROUP BY kode_cabang, kode_produk ORDER BY kode_cabang, jumlah_beli DESC) AS T1,(SELECT @nomorbaris := 0, @grouping := '') T Hasil Eksekusi akan menampilkan hasil yang sama dengan eksekusi sebelumnya kecuali ada 2 penambahan field baru yaitu nomorbaris dan Grouping. Juga terlihat pada hasil, tiap perpindahan group kode_cabang akan membuat nomorbaris kembali dimulai dari nilai 1.
Tahap Ketiga : Top N FilterSetelah mendapatkan konstruksi yang mendapatkan referensi nomorbaris, sekarang tinggal masalah gampang, yaitu jadikan subquery di atas sebagai subquery baru dan lakukan filter top n yang kita inginkan berdasarkan referensi nomor baris tersebut.
Sebagai contoh, kita ingin mendapatkan top 3 nilai penjualan tertinggi produk dari tiap cabang, maka tambahkan statement "where @nomorbaris < 4" dari subquery yang kita bentuk dari query di tahap kedua.
Query lengkapnya sekarang terlihat sebagai berikut :
SELECT T2.kode_cabang, T2.kode_produk, T2.jumlah_beli, T2.nomorbaris FROM (
SELECT T1.*, CASE WHEN @grouping != T1.kode_cabang THEN @nomorbaris := 1 ELSE @nomorbaris := @nomorbaris + 1 END AS nomorbaris, CASE WHEN @grouping != T1.kode_cabang THEN @grouping := T1.kode_cabang ELSE @grouping END AS Grouping FROM ( SELECT kode_produk, kode_cabang, SUM(jumlah_pembelian) AS jumlah_beli FROM tr_penjualan GROUP BY kode_cabang, kode_produk ORDER BY kode_cabang, jumlah_beli DESC) AS T1,(SELECT @nomorbaris := 0, @grouping := '') T ) AS T2 WHERE T2.nomorbaris < 4 Hasil eksekusi dari query tersebut adalah sebagai berikut dan merupakan solusi dari masalah kita :
![]() PenutupDemikian tips SQL untuk mendapatkan top n dari grouping tertentu. Dengan semakin berkembangnya laporan analisis yang cukup rumit, kita semakin dituntut untuk mengetahui advanced features yang mengolah set, seperti penggunaan variable yang ditunjukkan pada artikel ini.
Untuk Anda yang ingin lebih serius menangani persoalan iteratif - yang biasanya berujung ke navigasi cell - mungkin tertarik untuk mempelajari dunia OLAP (Online Analytical Processing) lebih jauh.
Bacaan Lebih Lanjut |
Bahasa SQL >