Pada kesempatan ini kita akan membahas mengenai cara untuk menghitung total dan subtotal pada MySQL,  setidaknya ada tiga cara yang dapat kita lakukan, yaitu: Show
Catatan: Artikel ini cukup panjang, jika ingin langsung ke topik yang diinginkan, silakan klik salah satu link diatas. Artikel lain untuk menjumlah kolom MySQL: Menghitung Field/Kolom Pada Tabel MySQL Dengan Kondisi Tertentu Menggunakan COUNT IF Sebelum lebih lanjut membahas ketiga cara diatas, sobat bisa langsung praktek dengan mengunduh file sql yang digunakan dalam artikel ini. file ini akan membuat tabel sales yang berisi sekitar 400 data penjualan dengan layout seperti pada tabel berikut: +--------------+-----------+------------+---------+---------+---------+---------+--------------+ | id_transaksi | id_produk | tgl_byr | thn_byr | jml_byr | jns_byr | id_bank | id_pelanggan | +--------------+-----------+------------+---------+---------+---------+---------+--------------+ | 1 | 100 | 2016-09-20 | 2016 | 265000 | 1 | 16 | 1 | | 2 | 100 | 2016-10-11 | 2016 | 270000 | 1 | 24 | 2 | | 3 | 101 | 2016-08-17 | 2016 | 250000 | 1 | 22 | 2 | | 9 | 101 | 2016-08-24 | 2016 | 380000 | 1 | 16 | 2 | | 11 | 101 | 2016-05-10 | 2016 | 250000 | 1 | 1 | 1 | +--------------+-----------+------------+---------+---------+---------+---------+--------------+ Download File SQLDownload ALL Files I. Menghitung Total dan Subtotal Pada MySQL dengan PHPMungkin cara inilah yang sering kita gunakan, karena praktis dan mudah untuk di praktekkan, cara tersebut kurang lebih seperti ini:
output yang dihasilkan: ID PELANGGANID PRODUKTOTAL110028.885.000110138.225.000210025.855.000210141.295.000TOTAL134.260.000 walaupun mudah dilakukan, namun terdapat beberapa kelemahan, yaitu:
TAHUNID PELANGGANID PRODUKTOTAL2015110013.660.0002015110119.885.000SUB TOTAL33.545.0002015210015.145.0002015210119.595.000SUB TOTAL34.740.000SUB TOTAL 201568.285.0002016110015.225.0002016110118.340.000SUB TOTAL33.565.0002016210010.710.0002016210121.700.000SUB TOTAL32.410.000SUB TOTAL 201665.975.000GRAND TOTAL134.260.000 Maka script PHP yang telah kita buat tapi perlu kita ubah menjadi: Download File PHPPerhatikan baris ke 7, pada baris tersebut kita simpan semua hasil query ke dalam variabel 8 hal ini harus dilakukan karena untuk membuat subtotal kita harus mengetahui nilai baris berikutnya (baris 33 dan 44),Jika row yang dihasilkan sedikit, penyimpanan ke dalam variabel 8 tidak akan membebani memori komputer, namun sebaliknya jika jumlah rownya banyak, kemungkinan dapat membebani memori karena data yang disimpan ke dalam variabel 8 semakin besar, yang akibatnya aplikasi berjalan lambat.Mempertimbangkan berbagai kekurangan diatas, saya pribadi berpendapat sebaiknya cara ini digunakan sebagai alternatif terakhir  ketika memang tidak ada cara lain yang bisa digunakan, misal pada pivot table yang kompleks yang melibatkan banyak fungsi agregasi. II. Menggunakan WITH ROLLUP Pada Query MySQLPada MySQL, klausa 1 digunakan bersamaan dengan klausa 2,  1 dapat digunakan baik untuk menghitung total maupun sub total sesuai dengan kolom yang kita gunakan dalam klausa 2.Kelebihan klausa ini adalah simpel dan dapat menghasilkan total dan subtotal hanya dalam satu query, sehingga membuat pekerjaan kita jauh lebih mudah dan sederhana. Misal, untuk menyelesaikan pembuatan total dan subtotal sebagaimana contoh sebelumnya, kita hanya perlu menambahkan 1 pada akhir query, sehingga querynya menjadi seperti ini:
itu saja cukup? ya itu saja, simpel kan? ….. mari kita lanjutkan, ketika kita jalankan query tersebut (menggunakan HEIDI SQL), hasil yang kita peroleh adalah: jika kita perhatikan, MySQL melakukan tiga fungsi penjumlahan berdasarkan kolom yang ada di 6
Perhatikan kolom yang diberikan tanda kotak merah, kenapa nilainya seperti itu? Nilai pada kolom tersebut, dan kolom sejenis yang dihasilkan oleh klausa GROUP BY dipilih secara bebas oleh MySQL, namun biasanya mengikuti nilai pada baris sebelumnya. 1 Mengganti Nilai NullJika kita perhatikan, nilai NULL kurang bermakna, sehingga kita perlu untuk mengubahnya. Kita dapat mengubah NULL dengan nilai lain menggunakan fungsi +---------+--------------+-----------+-----------+ | thn_byr | id_pelanggan | id_produk | jml_byr | +---------+--------------+-----------+-----------+ | 2015 | 1 | 100 | 13660000 | | 2015 | 1 | 101 | 19885000 | | 2015 | 1 | SUB TOTAL | 33545000 | | 2015 | 2 | 100 | 15145000 | | 2015 | 2 | 101 | 19595000 | | 2015 | 2 | SUB TOTAL | 34740000 | | 2015 | SUB TOTAL | SUB TOTAL | 68285000 | | 2016 | 1 | 100 | 15225000 | | 2016 | 1 | 101 | 18340000 | | 2016 | 1 | SUB TOTAL | 33565000 | | 2016 | 2 | 100 | 10710000 | | 2016 | 2 | 101 | 21700000 | | 2016 | 2 | SUB TOTAL | 32410000 | | 2016 | SUB TOTAL | SUB TOTAL | 65975000 | | TOTAL | SUB TOTAL | SUB TOTAL | 134260000 | +---------+--------------+-----------+-----------+8, beberapa ada yang menggunakan fungsi +---------+--------------+-----------+-----------+ | thn_byr | id_pelanggan | id_produk | jml_byr | +---------+--------------+-----------+-----------+ | 2015 | 1 | 100 | 13660000 | | 2015 | 1 | 101 | 19885000 | | 2015 | 1 | SUB TOTAL | 33545000 | | 2015 | 2 | 100 | 15145000 | | 2015 | 2 | 101 | 19595000 | | 2015 | 2 | SUB TOTAL | 34740000 | | 2015 | SUB TOTAL | SUB TOTAL | 68285000 | | 2016 | 1 | 100 | 15225000 | | 2016 | 1 | 101 | 18340000 | | 2016 | 1 | SUB TOTAL | 33565000 | | 2016 | 2 | 100 | 10710000 | | 2016 | 2 | 101 | 21700000 | | 2016 | 2 | SUB TOTAL | 32410000 | | 2016 | SUB TOTAL | SUB TOTAL | 65975000 | | TOTAL | SUB TOTAL | SUB TOTAL | 134260000 | +---------+--------------+-----------+-----------+9, saya sendiri prefer menggunakan  +---------+--------------+-----------+-----------+ | thn_byr | id_pelanggan | id_produk | jml_byr | +---------+--------------+-----------+-----------+ | 2015 | 1 | 100 | 13660000 | | 2015 | 1 | 101 | 19885000 | | 2015 | 1 | SUB TOTAL | 33545000 | | 2015 | 2 | 100 | 15145000 | | 2015 | 2 | 101 | 19595000 | | 2015 | 2 | SUB TOTAL | 34740000 | | 2015 | SUB TOTAL | SUB TOTAL | 68285000 | | 2016 | 1 | 100 | 15225000 | | 2016 | 1 | 101 | 18340000 | | 2016 | 1 | SUB TOTAL | 33565000 | | 2016 | 2 | 100 | 10710000 | | 2016 | 2 | 101 | 21700000 | | 2016 | 2 | SUB TOTAL | 32410000 | | 2016 | SUB TOTAL | SUB TOTAL | 65975000 | | TOTAL | SUB TOTAL | SUB TOTAL | 134260000 | +---------+--------------+-----------+-----------+8 karena termasuk dalam ANSI SQL standar (92) sehingga kompatibel dengan bahasa SQL pada database lain, seperti  MSSQL. Catatan: di MSSQL kita harus mengganti +---------+--------------+-----------+-----------+ | thn_byr | id_pelanggan | id_produk | jml_byr | +---------+--------------+-----------+-----------+ | 2015 | 1 | 100 | 13660000 | | 2015 | 1 | 101 | 19885000 | | 2015 | 1 | SUB TOTAL | 33545000 | | 2015 | 2 | 100 | 15145000 | | 2015 | 2 | 101 | 19595000 | | 2015 | 2 | SUB TOTAL | 34740000 | | 2015 | SUB TOTAL | SUB TOTAL | 68285000 | | 2016 | 1 | 100 | 15225000 | | 2016 | 1 | 101 | 18340000 | | 2016 | 1 | SUB TOTAL | 33565000 | | 2016 | 2 | 100 | 10710000 | | 2016 | 2 | 101 | 21700000 | | 2016 | 2 | SUB TOTAL | 32410000 | | 2016 | SUB TOTAL | SUB TOTAL | 65975000 | | TOTAL | SUB TOTAL | SUB TOTAL | 134260000 | +---------+--------------+-----------+-----------+9 dengan 2Dengan menggunakan +---------+--------------+-----------+-----------+ | thn_byr | id_pelanggan | id_produk | jml_byr | +---------+--------------+-----------+-----------+ | 2015 | 1 | 100 | 13660000 | | 2015 | 1 | 101 | 19885000 | | 2015 | 1 | SUB TOTAL | 33545000 | | 2015 | 2 | 100 | 15145000 | | 2015 | 2 | 101 | 19595000 | | 2015 | 2 | SUB TOTAL | 34740000 | | 2015 | SUB TOTAL | SUB TOTAL | 68285000 | | 2016 | 1 | 100 | 15225000 | | 2016 | 1 | 101 | 18340000 | | 2016 | 1 | SUB TOTAL | 33565000 | | 2016 | 2 | 100 | 10710000 | | 2016 | 2 | 101 | 21700000 | | 2016 | 2 | SUB TOTAL | 32410000 | | 2016 | SUB TOTAL | SUB TOTAL | 65975000 | | TOTAL | SUB TOTAL | SUB TOTAL | 134260000 | +---------+--------------+-----------+-----------+8, perintah SQL diatas kita ubah menjadi:
output yang dihasilkan: +---------+--------------+-----------+-----------+ | thn_byr | id_pelanggan | id_produk | jml_byr | +---------+--------------+-----------+-----------+ | 2015 | 1 | 100 | 13660000 | | 2015 | 1 | 101 | 19885000 | | 2015 | 1 | SUB TOTAL | 33545000 | | 2015 | 2 | 100 | 15145000 | | 2015 | 2 | 101 | 19595000 | | 2015 | 2 | SUB TOTAL | 34740000 | | 2015 | SUB TOTAL | SUB TOTAL | 68285000 | | 2016 | 1 | 100 | 15225000 | | 2016 | 1 | 101 | 18340000 | | 2016 | 1 | SUB TOTAL | 33565000 | | 2016 | 2 | 100 | 10710000 | | 2016 | 2 | 101 | 21700000 | | 2016 | 2 | SUB TOTAL | 32410000 | | 2016 | SUB TOTAL | SUB TOTAL | 65975000 | | TOTAL | SUB TOTAL | SUB TOTAL | 134260000 | +---------+--------------+-----------+-----------+ Jika ingin menampilkan tabel diatas pada browser, script PHP yang kita perlukan: Download File PHP Script Diatas2 Menggunakan ORDER BY Pada WITH ROLLUP Pada MySQLUntuk mengurutkan hasil query yang mengandung klausa 1, kita tidak bisa langsung menggunakan klausa 5, karena sifat keduanya independen (berdiri sendiri), untuk itu, terdapat dua cara yang dapat kita lakukan yaitu dengan implisit order dan eksplisit order:Dengan Implisit OrderKetika kita menjalankan klausa GROUP BY, sebenarnya, disaat yang sama, MySQL juga melakukan pengurutan data,  namun karena tidak dinyatakan dengan jelas, maka sering disebut implisit order. Pada contoh sebelumnya terlihat bahwa kolom 9 diurutkan secara ascending (urut dari nilai terkecil ke nilai terbesar), demikian juga pada kolom 0 dan 1Pada implisit order, kita dapat mengubah cara pengurutannya dengan menambahkan 9 atau 0 pada klausa 2, misal, pada contoh sebelumnya kita balik urutan data pada kolom, 9, 0, dan 1
Hasil yang kita peroleh: +---------+--------------+-----------+-----------+ | thn_byr | id_pelanggan | id_produk | jml_byr | +---------+--------------+-----------+-----------+ | 2016 | 2 | 101 | 21700000 | | 2016 | 2 | 100 | 10710000 | | 2016 | 2 | SUB TOTAL | 32410000 | | 2016 | 1 | 101 | 18340000 | | 2016 | 1 | 100 | 15225000 | | 2016 | 1 | SUB TOTAL | 33565000 | | 2016 | SUB TOTAL | SUB TOTAL | 65975000 | | 2015 | 2 | 101 | 19595000 | | 2015 | 2 | 100 | 15145000 | | 2015 | 2 | SUB TOTAL | 34740000 | | 2015 | 1 | 101 | 19885000 | | 2015 | 1 | 100 | 13660000 | | 2015 | 1 | SUB TOTAL | 33545000 | | 2015 | SUB TOTAL | SUB TOTAL | 68285000 | | TOTAL | SUB TOTAL | SUB TOTAL | 134260000 | +---------+--------------+-----------+-----------+ Pada tabel diatas terlihat bahwa kolom tahun kolom, 9, 0, dan 1 telah diurutkan secara descending.Namun demikian, pada MySQL versi 5.7, fitur ini sudah deprecated artinya sudah tidak disarankan lagi untuk digunakan karena pada versi berikutnya fitur ini akan dihilangkan. Untuk itu, disarankan untuk menggunakan eksplisit order dengan menggunakan klausa 5Dengan Eksplisit OrderUntuk dapat mengaplikasikan eksplisit order, terlebih dahulu kita buat temporary table (sub query) yang mengandung klausa 1, selanjutnya urutkan data tersebut menggunakan klausa 5 yang ada pada query utama.Meneruskan contoh sebelumnya, kali ini kita urutkan kolom 9 dari nilai terbesar ke terkecil:
Output yang dihasilkan adalah: 0Perhatikan bahwa pada baris ke 4, kita menggunakan perintah +---------+--------------+-----------+-----------+ | thn_byr | id_pelanggan | id_produk | jml_byr | +---------+--------------+-----------+-----------+ | 2016 | 2 | 101 | 21700000 | | 2016 | 2 | 100 | 10710000 | | 2016 | 2 | SUB TOTAL | 32410000 | | 2016 | 1 | 101 | 18340000 | | 2016 | 1 | 100 | 15225000 | | 2016 | 1 | SUB TOTAL | 33565000 | | 2016 | SUB TOTAL | SUB TOTAL | 65975000 | | 2015 | 2 | 101 | 19595000 | | 2015 | 2 | 100 | 15145000 | | 2015 | 2 | SUB TOTAL | 34740000 | | 2015 | 1 | 101 | 19885000 | | 2015 | 1 | 100 | 13660000 | | 2015 | 1 | SUB TOTAL | 33545000 | | 2015 | SUB TOTAL | SUB TOTAL | 68285000 | | TOTAL | SUB TOTAL | SUB TOTAL | 134260000 | +---------+--------------+-----------+-----------+2 bukan +---------+--------------+-----------+-----------+ | thn_byr | id_pelanggan | id_produk | jml_byr | +---------+--------------+-----------+-----------+ | 2016 | 2 | 101 | 21700000 | | 2016 | 2 | 100 | 10710000 | | 2016 | 2 | SUB TOTAL | 32410000 | | 2016 | 1 | 101 | 18340000 | | 2016 | 1 | 100 | 15225000 | | 2016 | 1 | SUB TOTAL | 33565000 | | 2016 | SUB TOTAL | SUB TOTAL | 65975000 | | 2015 | 2 | 101 | 19595000 | | 2015 | 2 | 100 | 15145000 | | 2015 | 2 | SUB TOTAL | 34740000 | | 2015 | 1 | 101 | 19885000 | | 2015 | 1 | 100 | 13660000 | | 2015 | 1 | SUB TOTAL | 33545000 | | 2015 | SUB TOTAL | SUB TOTAL | 68285000 | | TOTAL | SUB TOTAL | SUB TOTAL | 134260000 | +---------+--------------+-----------+-----------+3 Kita sengaja gunakan angka +---------+--------------+-----------+-----------+ | thn_byr | id_pelanggan | id_produk | jml_byr | +---------+--------------+-----------+-----------+ | 2016 | 2 | 101 | 21700000 | | 2016 | 2 | 100 | 10710000 | | 2016 | 2 | SUB TOTAL | 32410000 | | 2016 | 1 | 101 | 18340000 | | 2016 | 1 | 100 | 15225000 | | 2016 | 1 | SUB TOTAL | 33565000 | | 2016 | SUB TOTAL | SUB TOTAL | 65975000 | | 2015 | 2 | 101 | 19595000 | | 2015 | 2 | 100 | 15145000 | | 2015 | 2 | SUB TOTAL | 34740000 | | 2015 | 1 | 101 | 19885000 | | 2015 | 1 | 100 | 13660000 | | 2015 | 1 | SUB TOTAL | 33545000 | | 2015 | SUB TOTAL | SUB TOTAL | 68285000 | | TOTAL | SUB TOTAL | SUB TOTAL | 134260000 | +---------+--------------+-----------+-----------+4 untuk mencerminkan total karena 9 akan diurutkan mengecil sehingga angka +---------+--------------+-----------+-----------+ | thn_byr | id_pelanggan | id_produk | jml_byr | +---------+--------------+-----------+-----------+ | 2016 | 2 | 101 | 21700000 | | 2016 | 2 | 100 | 10710000 | | 2016 | 2 | SUB TOTAL | 32410000 | | 2016 | 1 | 101 | 18340000 | | 2016 | 1 | 100 | 15225000 | | 2016 | 1 | SUB TOTAL | 33565000 | | 2016 | SUB TOTAL | SUB TOTAL | 65975000 | | 2015 | 2 | 101 | 19595000 | | 2015 | 2 | 100 | 15145000 | | 2015 | 2 | SUB TOTAL | 34740000 | | 2015 | 1 | 101 | 19885000 | | 2015 | 1 | 100 | 13660000 | | 2015 | 1 | SUB TOTAL | 33545000 | | 2015 | SUB TOTAL | SUB TOTAL | 68285000 | | TOTAL | SUB TOTAL | SUB TOTAL | 134260000 | +---------+--------------+-----------+-----------+4 akan berada di pisisi paling bawah, jika kita gunakan +---------+--------------+-----------+-----------+ | thn_byr | id_pelanggan | id_produk | jml_byr | +---------+--------------+-----------+-----------+ | 2016 | 2 | 101 | 21700000 | | 2016 | 2 | 100 | 10710000 | | 2016 | 2 | SUB TOTAL | 32410000 | | 2016 | 1 | 101 | 18340000 | | 2016 | 1 | 100 | 15225000 | | 2016 | 1 | SUB TOTAL | 33565000 | | 2016 | SUB TOTAL | SUB TOTAL | 65975000 | | 2015 | 2 | 101 | 19595000 | | 2015 | 2 | 100 | 15145000 | | 2015 | 2 | SUB TOTAL | 34740000 | | 2015 | 1 | 101 | 19885000 | | 2015 | 1 | 100 | 13660000 | | 2015 | 1 | SUB TOTAL | 33545000 | | 2015 | SUB TOTAL | SUB TOTAL | 68285000 | | TOTAL | SUB TOTAL | SUB TOTAL | 134260000 | +---------+--------------+-----------+-----------+7, maka baris tersebut akan berada di posisi paling atas. 3 Menggunakan LIMIT Pada WITH ROLLUPPenggunaan klausa +---------+--------------+-----------+-----------+ | thn_byr | id_pelanggan | id_produk | jml_byr | +---------+--------------+-----------+-----------+ | 2016 | 2 | 101 | 21700000 | | 2016 | 2 | 100 | 10710000 | | 2016 | 2 | SUB TOTAL | 32410000 | | 2016 | 1 | 101 | 18340000 | | 2016 | 1 | 100 | 15225000 | | 2016 | 1 | SUB TOTAL | 33565000 | | 2016 | SUB TOTAL | SUB TOTAL | 65975000 | | 2015 | 2 | 101 | 19595000 | | 2015 | 2 | 100 | 15145000 | | 2015 | 2 | SUB TOTAL | 34740000 | | 2015 | 1 | 101 | 19885000 | | 2015 | 1 | 100 | 13660000 | | 2015 | 1 | SUB TOTAL | 33545000 | | 2015 | SUB TOTAL | SUB TOTAL | 68285000 | | TOTAL | SUB TOTAL | SUB TOTAL | 134260000 | +---------+--------------+-----------+-----------+8 pada 1 terkadang menghasilkan output yang tidak sesuai harapan, karena tambahan baris baru yang dihasilkan oleh kalusa 1 akan dimasukkan dalam penghitungan baris, contoh: 1Output yang dihasilkan adalah: 2Pada contoh diatas, terlihat bahwa MySQL mengambil 5 baris pertama hasil query termasuk baris yang dihasilkan oleh klausa WITH ROLLUP III. Menggunakan Query Tersendiri Untuk Menghitung Total Pada MySQLMenggunakan 1 cukup memadahi untuk menghitung total dan subtotal, namun memiliki keterbatasan yaitu hanya dapat melakukan operasi penjumlahan, permasalahan tersebut dapat diatasi dengan cara ketiga ini.Dengan cara ini kita menambahkan baris baru secara manual untuk menghitung total dan subtotal. Penambahan tersebut bisa langsung disertakan pada query utama atau pada sub query, tergantung kondisi yang ada. Untuk menghitung total saja, kita cukup menambahkan query di bawah query utama, contoh: 3Hasil yang kita peroleh: 4Perhatikan bahwa dengan cara ketiga ini, kita dapat lebih mudah melakukan pengolahan data. Pada contoh diatas, kita dapat mengurutkan data pembayaran mulai dari yang terbesar hingga terkecil dan sekaligus mengurutkan tahun dari yang terbesar hingga terkecil dengan hasil yang rapi, hal tersebut cukup sulit dilakukan jika menggunakan WITH ROLLUP. 1 Menggunakan Berbagai Fungsi AgregasiPenggunaan query secara manual juga memungkinkan kita untuk melakukan berbagai fungsi agregasi. Contoh berikut ini sedikit memodifikasi contoh sebelumya, kali ini kita akan:
Kode SQLnya adalah: 5output yang dihasilkan adalah: 6Perhatikan bahwa kita menyimpan nilai grand total (nilai yang kita gunakan untuk menghitung rasio) ke dalam variabel 6. Hal ini kita lakukan karena nilai tersebut digunakan lebih dari satu kali dan tidak efisien jika dilakukan query berulang kali.Pada contoh diatas, kita kumpulkan kata-kata 1-SUB TOTAL, 2-SUB TOTAL, TOTAL 2016, TOTAL 2015 dan GRAND TOTAL pada kolom 0.Bentuk kata-kata tersebut diatur sedemikian rupa sehingga ketika diurutkan, output yang dihasilkan sesuai dengan yang kita inginkan, contoh untuk tahun 2016, 1-SUB TOTAL lebih besar dari 1, sehingga di tempatkan di bawah 1, demikian juga 2 dan TOTAL 2016. 2 Penambahan Kolom BaruUntuk menghasilkan layout seperti diatas memang benar-benar tergantung pada pemilihan kata yang akan diurutkan, jika pemilihan katanya tidak tepat bisa jadi menghasilkan urutan yang berbeda. Misal pada perintah sql sebelumnya, baris ke 8 kita ganti perintahnya dari 8 menjadi CONCAT(‘ 9, maka hasil yang diperoleh:thn_byrid_pelangganid_produkjml_byrrasio201611011834000013.66201611001522500011.34201621012170000016.1620162100107100007.982016SUB TOTAL-11003356500025.002016SUB TOTAL-21003241000024.142016TOTAL 20161006597500049.14201511011988500014.81201511001366000010.17201521011959500014.59201521001514500011.282015SUB TOTAL-11003354500025.882015SUB TOTAL-21003474000024.992015TOTAL 20151006828500050.86NULLGRAND TOTALNULL134260000100.00 dari tabel diatas terlihat bahwa urutannya berubah, tidak sesuai yang diharapkan. Bagaimana cara mengatasinya? Ada cara lain yaitu menambahkan kolom baru untuk 00 dan 01, cara ini tidak sulit dilakukan jika:
3 Membuat Temporary IndexKondisi menjadi sulit jika tidak ada urutan yang jelas antar row, query yang dilakukan membutuhkan logika yang cukup kompleks. Untuk mengatasi ini, kita perlu menciptakan temporary field berisi indeks (urutan) dari baris, melanjutkan contoh sebelumnya:
perintah sql nya adalah: 7hasil yang kita dapatkan: 8Perhatikan bahwa kita menggunakan variabel @idx untuk menyimpan urutan baris utama dan @idx2 untuk menyimpan urutan baris berikutnya (nilai @idx2 adalah @idx + 1). Query Selanjutnya… Setelah kita ketahui nilai 9 row berikutnya (kolom 05), kita tinggal menguji nilai 9 tersebut.Jika nilainya tidak sama (seperti pada baris yang di bold), maka kita tahu bahwa baris tersebut adalah baris terakhir dari tahun berjalan, sehingga kita lakukan penjumlahan untuk mendapatkan subtotal tahun tersebut. Kita ubah querynya menjadi: 9hasil yang kita peroleh: 0perhatikan perintah SQL pada baris ke 20, kita hitung subtotal untuk tahun yang sama ketika nilai pada variabel @idx1 dan @idx2 berbeda. Cara diatas dapat menginspirasi kita untuk membuat subtotal per 0, yang saya yakin sobat semua lebih mahir melakukannya.Cara terakhir ini lebih aman, setidaknya ketika kita ubah urutan tahunnya, nilai pada kolom sub_total akan mengikutinya. Coba pada perintah sql terakhir, kita ubah semua kata DESC menjadi ASC, maka data akan diurutkan berdasarkan nilai 9 mulai dari yang terkecil hingga paling besar dan nilai pada kolom sub_total akan mengikutinya.Namun demikian, terdapat beberapa kekurangan pada cara ini, diantaranya memerlukan query yang lebih kompleks, sehingga semakin besar jumlah data yang diolah, maka semakin lama waktu eksekusinya. VI. KesimpulanDari pembahasan diatas dapat disimpulkan bahwa untuk menghitung total dan subtotal pada mysql, setidaknya ada tiga cara yang dapat digunakan, yaitu:
dari ketiga cara diatas, mana yang sebaiknya kita gunakan? semua kembali kepada kondisi yang ada, saya pribadi penganut prinsip “sekali jadi”, dimana pengolahan data sebisa mungkin selesai diperintah SQL. Demikian pembahasan mengenai menghitung total dan subtotal pada MySQL, semoga bermanfaat. Subscibe NowSuka dengan artikel di Jagowebdev.com? jangan sampai ketinggalan, segera join ke milis kami untuk update informasi terbaru dari Jagowebdev.com Komitmen Kami: Kami senantiasa menghargai privasi Anda dan tidak akan membagikan identitas Anda ke pihak manapun. Wandia says: 12 January 2017 at 16:21 Halo mas, kalau boleh minta tutorialnya untuk penerapan mysql pada script php untuk menghitung total dari beberapa item. Sejauh ini saya baru mempelajari php untuk menghitung total item yang dipilih yaitu dengan menggunakan input checkbox. Nah lalu bagaimana cara menghitung total apabila item yang ingin dihitung didapatkan dari tabel mysql. Misal saya punya tabel seperti ini: |——- Item ——- | —- Berat per Pack —- | Dari tabel diatas dijadikan dalam bentuk mysql dan untuk form php nya kira-kira seperti ini: [ ] Gula Misalkan berat per pack dalam satuan gram dan untuk harga per gram anggaplah sama untuk semua item yaitu Rp.500 Jadi dari tabel mysql dan form php tersebut nanti bisa dimunculkan total harganya dari item yang di ceklis. Terima kasih sebelumnya. Reply Wandia says: 20 January 2017 at 22:49 Halo mas berkaitan dengan yang pernah saya tanyakan di #comment-1330 sebelumnya. Saya sudah bisa menerapkan dari contoh script yang mas berikan tersebut. Tujuan saya adalah ingin membuat semacam form yang isinya adalah: Saya sudah berhasil menerapkannya. Terdapat 2 halaman yang saya buat, yang pertama adalah form.html dan yang kedua adalah summary.php yang isinya adalah tampilan hasil output form tadi. Yang saya tanyakan adalah bagaimana supaya tampilan dari summary.php tersebut selanjutnya juga bisa dikirimkan ke email, tapi dengan bentuk teks yang tersusun rapi per baris, bukan langsung sederet tulisan. Terima kasih. Reply Harjono says: 16 April 2018 at 02:12 malam mas, saya ada beberapa pertanyaan.. kiranya sudi membantu. 1kemudian untuk di tampilan webnya saya ingin ada 1 combo box dan 2 text box, mohon bantuannya untuk script PHP yang simple untuk model diatas. Reply Ahmad says: 21 May 2018 at 09:54 pak saya dibantu scriptnya php mysql dong…. saya bingung menampilkan table spd bulan pertama, spd bulan kedua, dan spd bulan ketiga,, ya script phpnya seperti dibawah ini pak… 2 3Reply Haris86 says: 17 October 2018 at 19:04 mohon pencerahan mas Struktur Tabel: 4Trus tabel data yg diinput kayak gini: 5Pertanyaannya gini mas., saya mau gabungin data itu buat tampilin trus saya mau hitung nilainya untuk total sama mau di kalikan dengan data dari T.score sehinggal dapat nilai Score lalu dihitung lagi buat dapat sub total dari score., jadi nanti hasilnya kayak dibawah ini mas T.Hasil 6mohon pencerahan mas Reply Edwin says: 23 November 2018 at 09:27 jml penerimaan tgl Met pagi pak agus, saya mau menanyakan bagaiaman caranya memisah hasil jumlah dan penerimaanx tersendiri, sehingga hasilx jml1,jml2, penerimaan1,penerimaan2,tgl ?? |