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.
rekeningId | jenis | total |
---|---|---|
4 | D |
3000
|
5 | D |
35000
|
10 | D |
10000
|
11 | D |
5000
|
12 | D |
1000
|
13 | D |
5000
|
14 | D |
71000
|
1 | D |
130000
|
22 | D |
40000
|
26 | D |
25000
|
27 | D |
35000
|
27 | K |
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:
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;
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 :)
Sip, cak.... :)
BalasHapusTerima kasih atas kunjungannya, Pak @eshabe :D
HapusGimana kalau di jenis itu ada A,B,C,D dan kita ingin tahu jumlah masing2 jenis saja.
BalasHapusproduk|id_gudang|jumlah
A 1 40
A 2 15
B 1 2
B 2 21
C 1 30
C 2 17
dst
Terimkasih atas jawabannnya, Mas Nanang :)
Berarti SUM per jenis begitu kah, tanpa memperhatikan apakah nilai itu negatif atau positif kan?
HapusMungkin bisa dengan cara menambahkan GROUP BY di query untuk menjumlah per group (A, B, C, dst..)
*semogaBener*
hatur nuhun
BalasHapussami sami :)
Hapus