Menghitung Field/Kolom Pada Tabel MySQL/Postgre Dengan Kondisi Tertentu Menggunakan COUNT IF
Seperti kita ketahui, untuk menghitung row/baris pada tabel, kita menggunakan fungsi COUNT, yang otomatis menghitung jumlah row yang ada nilainya (row dengan nilai NULL tidak akan dihitung). baris yang dihitung dapat dilakukan dengan 2 cara yaitu:
COUNT(*)
yaitu menghitung row untuk semua fieldCOUNT(field_name)
yaitu menghitung row untuk field tertentu
Sedangkan fungsi count dibag menjadi 2 yaitu:
COUNT
untuk menghitung semua row walaupun ada duplikasi dataCOUNT (DISTINCT)
untuk menghitung row yang unique
melanjutkan pada artikel sebelumnya, sekarang kita akan menghitung jumlah item yang terjual berdasarkan tahun panjualan, query yang kita gunakan :
SELECT COUNT(IF(tgl_byr LIKE "2011%", jml_byr, NULL)) AS item_2011,
COUNT(IF(tgl_byr LIKE "2010%", jml_byr, NULL)) AS item_2010,
SUM(IF(tgl_byr LIKE "2011%", jml_byr, 0)) AS jml_2011,
SUM(IF(tgl_byr LIKE "2010%", jml_byr, 0)) AS jml_2010
FROM tunai
yang akan menghasilkan:
+----------+----------+----------+----------+ | item_2011| item_2010| jml_2011 | jml_2010 | +----------+----------+----------+----------+ | 8 | 5 | 16124000 | 9955000 | +----------+----------+----------+----------+
selanjutnya jika kita akan mengkelompokkan hasil tersebut berdasarkan field/kolom tertentu misal id_pelanggan dan id_cabang maka kita menggunakan GROUP BY. Contoh:
SELECT id_pelanggan,
id_cabang,
COUNT(IF(tgl_byr LIKE "2011%", jml_byr, NULL)) AS item_2011,
COUNT(IF(tgl_byr LIKE "2010%", jml_byr, NULL)) AS item_2010,
SUM(IF(tgl_byr LIKE "2011%", jml_byr, 0)) AS jml_2011,
SUM(IF(tgl_byr LIKE "2010%", jml_byr, 0)) AS jml_2010
FROM tunai
GROUP BY id_pelanggan, id_cabang
maka hasil yang akan kita peroleh:
+--------------+-----------+-----------+-----------+----------+----------+ | id_pelanggan | id_cabang | item_2011 | item_2010 | jml_2011 | jml_2010 | +--------------+-----------+-----------+-----------+----------+----------+ | 012546 | 12 | 1 | 2 | 1500000 | 4000000 | | 015558 | 01 | 1 | 1 | 2900000 | 775000 | | 020011 | 02 | 1 | 1 | 1725000 | 2450000 | | 020011 | 05 | 3 | 0 | 3500000 | 0 | | 027845 | 07 | 2 | 1 | 6499000 | 2730000 | +--------------+-----------+-----------+-----------+----------+----------+ 5 rows in set (0.00 sec)
lain hal bila menggunakan postgre
querynya seperti ini.
SELECT id_pelanggan,
id_cabang,
COUNT(case tgl_byr LIKE "2011%" then 1 end) AS item_2011,
COUNT(case tgl_byr LIKE "2010%" then 1 end) AS item_2010,
SUM(case tgl_byr LIKE "2011%" then 1 end) AS jml_2011,
SUM(case tgl_byr LIKE "2010%", then 1 end) AS jml_2010
FROM tunai
GROUP BY id_pelanggan, id_cabang