Jumat, 22 Februari 2013

Query SUM+IF pada MySQL

Tulisan ini sekedar memberikan cara alternatif meng-query data di MySQL, sebuah cara meng-query yang bisa dipakai untuk menghitung nilai saldo (balance) dari seluruh transaksi keuangan yang memiliki fitur D (debet) dan K (kredit) dengan contoh data sebagai berikut.

rekeningIdjenistotal
4D
3000
5D
35000
10D
10000
11D
5000
12D
1000
13D
5000
14D
71000
1D
130000
22D
40000
26D
25000
27D
35000
27K
34100

Tabel tersebut menyajikan saldo tiap-tiap rekening yang terkelompok per jenis transaksi (D/K). Kolom "rekeningId" pada tabel tersebut menandakan ID rekening, kolom "jenis" merupakan jenis transaksinya, dan kolom "total" merupakan saldo rekening per jenis transaksi.

Permasalahan yang harus diselesaikan adalah bagaimana caranya agar nominal tersebut dapat dijumlahkan sehingga bisa didapatkan saldo total dari seluruh rekening, tentu saja setelah dikurangi nominal yang berjenis K.

Beberapa model query mungkin bisa digunakan, namun pada tulisan ini saya mencoba untuk mengombinasikan fungsi agregat SUM dengan menambahkan kondisi di dalamnya. Berikut contoh script SQL-nya:



SELECT SUM( IF( jenis =  'D', total, -total ) ) AS saldoTotal
FROM nama_tabel;

Kondisi [jenis = 'D'] tersebut menandakan kalau nilai yang ditambahkan adalah nilai positif (+). Namun, jika jenis dari baris data merupakan 'K', maka nilainya akan diubah menjadi minus (-) terlebih dahulu sebelum dijumlahkan. Sehingga, ketika perintah SUM dijalankan, secara otomatis item-item transaksi yang berjenis K akan menjadi pengurang saldo.

Cara tersebut dapat mempersingkat script SQL yang biasanya saya lakukan dengan menggunakan subquery yang lumrahnya memakan waktu (berat di proses). Query tersebut mungkin dapat juga diaplikasikan di beberapa studi kasus lain dengan kondisi yang serupa (menjumlahkan kolom yang memiliki kondisi positif dan negatif namun disimpan dalam bentuk positif [unsigned]).

Demikian tulisan kali ini, dan selamat mencoba :)