Menghitung Total dan Subtotal Pada MySQL

Pada kesempatan ini kita akan membahas mengenai cara untuk menghitung total dan subtotal pada MySQL,  setidaknya ada tiga cara yang dapat kita lakukan, yaitu:

  1. Membuat script seperti PHP untuk melakukan penjumlahan sehingga menghasilkan total atau subtotal
  2. Menggunakan ROLLUP pada query MySQL
  3. Melakukan penggabungan query

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 |
+--------------+-----------+------------+---------+---------+---------+---------+--------------+

I. Menghitung Total dan Subtotal Pada MySQL dengan PHP

Mungkin cara inilah yang sering kita gunakan, karena praktis dan mudah untuk di praktekkan, cara tersebut kurang lebih seperti ini:

<?php
$sql = 'SELECT id_pelanggan, id_produk, SUM(jml_byr) AS total 
		FROM `sales` 
		GROUP BY id_pelanggan, id_produk';
$stmt = $pdo->prepare($sql);
$stmt->execute();

echo '<table>
		<thead>
			<tr>
				<td>ID PELANGGAN</td>
				<td>ID PRODUK</td>
				<td>TOTAL</td>
			</tr>
		</thead>
		<tbody>';
$total = 0;
while ($row = $stmt->fetch())
{
	echo '<tr>
			<td>' . $row['id_pelanggan'] . '</td>
			<td>' . $row['id_produk'] . '</td>
			<td>' . number_format($row['total'], 0, ',', '.') . '</td>
		</tr>';
	$total += $row['total'];
}
echo '<tr>
		<td colspan="2">TOTAL</td>
		<td>' . number_format($total, 0, ',', '.') . '</td>
	 </tr>
	</tbody>
</table>';

output yang dihasilkan:

ID PELANGGAN ID PRODUK TOTAL
1 100 28.885.000
1 101 38.225.000
2 100 25.855.000
2 101 41.295.000
TOTAL 134.260.000

walaupun  mudah dilakukan, namun terdapat beberapa kelemahan, yaitu:

  • Ketika hasil query digunakan pada bahasa pemrograman lain, kita harus menulis ulang kode nya  (porting),
  • Pada situasi tertentu misal ketika harus membuat sub total, maka kode yang kita tulis semakin rumit tergantung kompleksitas layout yang ingin kita buat. misal kita ingin mendapatkan output berikut:
TAHUN ID PELANGGAN ID PRODUK TOTAL
2015 1 100 13.660.000
2015 1 101 19.885.000
SUB TOTAL 33.545.000
2015 2 100 15.145.000
2015 2 101 19.595.000
SUB TOTAL 34.740.000
SUB TOTAL 2015 68.285.000
2016 1 100 15.225.000
2016 1 101 18.340.000
SUB TOTAL 33.565.000
2016 2 100 10.710.000
2016 2 101 21.700.000
SUB TOTAL 32.410.000
SUB TOTAL 2016 65.975.000
GRAND TOTAL 134.260.000

Maka script PHP  yang telah kita buat tapi perlu kita ubah menjadi:

<?php
function format_ribuan ($nilai){
	return number_format ($nilai, 0, ',', '.');
}

// Ubah hasil query menjadi associative array dan simpan kedalam variabel result
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

echo '<table>
		<thead>
			<tr>
				<th>TAHUN</th>
				<th>ID PELANGGAN</th>
				<th>ID PRODUK</th>
				<th>TOTAL</th>
			</tr>
		</thead>
		<tbody>';
		
$subtotal_plg = $subtotal_thn = $total = 0;
foreach ($result as $key => $row)
{
	$subtotal_plg += $row['jml_byr'];
	$subtotal_thn += $row['jml_byr'];
	echo '<tr>
			<td>'.$row['thn_byr'].'</td>
			<td>'.$row['id_pelanggan'].'</td>
			<td>'.$row['id_produk'].'</td>
			<td class="right">'.format_ribuan($row['jml_byr']).'</td>
		</tr>';
	
	// SUB TOTAL per id_pelanggan
	if (@$result[$key+1]['id_pelanggan'] != $row['id_pelanggan']) {
		echo '<tr class="subtotal">
			<td></td>
			<td>SUB TOTAL</td>
			<td></td>
			<td class="right">'.format_ribuan($subtotal_plg).'</td>
		</tr>';
		$subtotal_plg = 0;
	}
	
	// SUB TOTAL per thn_byr
	if (@$result[$key+1]['thn_byr'] != $row['thn_byr']) {
		echo '<tr class="subtotal">
			<td></td>
			<td>SUB TOTAL ' . $row['thn_byr'] . '</td>
			<td></td>
			<td class="right">'.format_ribuan($subtotal_thn).'</td>
		</tr>';
		$subtotal_thn = 0;
	} 
	$total += $row['jml_byr'];
}

// GRAND TOTAL
echo '<tr class="total">
		<td></td>
		<td>GRAND TOTAL</td>
		<td></td>
		<td class="right"> ' . format_ribuan($total) . '</td>
	</tr>
	</tbody>
</table>
</body>
</html>';
Download File PHP

Perhatikan baris ke 7, pada baris tersebut kita simpan semua hasil query ke dalam variabel $result 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  $result tidak akan membebani memori komputer, namun sebaliknya jika jumlah rownya banyak, kemungkinan dapat  membebani memori karena data yang disimpan ke dalam variabel $result 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 MySQL

Pada  MySQL, klausa  WITH ROLLUP  digunakan  bersamaan dengan klausa  GROUP BY,  WITH ROLLUP  dapat digunakan baik untuk menghitung total maupun sub total sesuai dengan kolom yang kita gunakan dalam klausa  GROUP BY.

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 WITH ROLLUP  pada akhir query, sehingga querynya menjadi seperti ini:

SELECT thn_byr, id_pelanggan, id_produk, SUM(jml_byr) AS jml_byr 
FROM `sales` 
GROUP BY thn_byr, id_pelanggan, id_produk WITH ROLLUP

itu saja cukup? ya itu saja, simpel kan? ….. mari kita lanjutkan, ketika kita  jalankan query tersebut (menggunakan HEIDI SQL), hasil yang kita  peroleh adalah:

Menghitung Total dan Subtotal Pada MySQL dengan With Rollup

jika kita perhatikan, MySQL melakukan tiga fungsi penjumlahan berdasarkan kolom yang ada di group by

Menghitung Total dan Subtotal Pada MySQL

  1. thn_byr.  MySQL menambahkan baris baru untuk menjumlahkan kolom jml_byr  per thn_byr  dengan memberikan nilai NULL pada kolom  id_pelanggan dan id_produk
  2. thn_byr dan  id_pelanggan.  MySQL menambahkan baris baru untuk menjumlahkan kolom jml_byr per (thn_byr dan id_pelanggan) dengan memberikan nilai NULL pada kolom  id_produk
  3. thn_byr, id_pelanggan dan id_produk.  MySQL menambahkan baris baru untuk menjumlahkan kolom jml_byr  untuk per (id_produk, id_pelanggan dan thn_byr) dengan memberikan nilai NULL pada kolom thn_byr, id_pelanggan dan id_produk.

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 Null

Jika kita perhatikan, nilai NULL kurang bermakna, sehingga kita perlu untuk mengubahnya.

Kita dapat mengubah NULL dengan nilai lain menggunakan fungsi COALESCE, beberapa ada yang menggunakan fungsi IFNULL, saya sendiri prefer menggunakan  COALESCE karena termasuk dalam  ANSI SQL standar (92) sehingga kompatibel dengan bahasa SQL pada database lain, seperti  MSSQL.

Catatan: di MSSQL kita harus mengganti IFNULL dengan ISNULL.

Dengan menggunakan  COALESCE, perintah SQL diatas kita ubah menjadi:

SELECT COALESCE(thn_byr, 'TOTAL') AS thn_byr, 
		COALESCE(id_pelanggan, 'SUB TOTAL') AS id_pelanggan,
		COALESCE(id_produk, 'SUB TOTAL') AS id_produk,
		SUM(jml_byr) AS jml_byr 
FROM `sales` 
GROUP BY thn_byr, id_pelanggan, id_produk WITH ROLLUP

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:

<?php
echo '<table class="grey">
		<thead>
			<tr>
				<th>TAHUN</th>
				<th>ID PELANGGAN</th>
				<th>ID FRODUK</th>
				<th>TOTAL</th>
			</tr>
		</thead>
		<tbody>';
while ($row = $stmt->fetch())
{
	$class = '';
	
	// jika ada total atau sub total
	if ($row['thn_byr'] == 'TOTAL') {
		$class = ' class="total"';
	} else if ($row['id_pelanggan'] == 'SUB TOTAL' || $row['id_produk'] == 'SUB TOTAL') {
		$class = ' class="subtotal"';
	}
	
	echo 
	'<tr'.$class.'>
		<td>' . $row['thn_byr'] . '</td>
		<td>' . $row['id_pelanggan'] . '</td>
		<td>' . $row['id_produk'] . '</td>
		<td class="right">' . number_format($row['jml_byr'], '0', ',', '.') . '</td>
	</tr>';
}
echo '
	</tbody>
</table>
</body>
</html>';
Download File PHP Script Diatas

2 Menggunakan ORDER BY Pada WITH ROLLUP Pada MySQL

Untuk mengurutkan hasil query yang mengandung klausa  WITH ROLLUP, kita tidak bisa langsung menggunakan klausa ORDER BY, karena sifat keduanya independen (berdiri sendiri), untuk itu, terdapat dua cara yang dapat kita lakukan yaitu dengan implisit order dan eksplisit order:

Dengan Implisit Order

Ketika 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 thn_byr  diurutkan secara ascending  (urut dari nilai terkecil ke nilai terbesar), demikian juga pada kolom id_pelanggan dan id_produk

Pada implisit order, kita dapat mengubah cara pengurutannya dengan menambahkan ASC atau DESC pada klausa GROUP BY, misal, pada contoh sebelumnya kita balik urutan data pada kolom, thn_byr, id_pelanggan, dan id_produk

SELECT	COALESCE(thn_byr, 'TOTAL') AS thn_byr, 
	COALESCE(id_pelanggan, 'SUB TOTAL') AS id_pelanggan,
	COALESCE(id_produk, 'SUB TOTAL') AS id_produk,
	SUM(jml_byr) AS jml_byr 
FROM `sales` 
GROUP BY thn_byr DESC, id_pelanggan DESC, id_produk DESC
WITH ROLLUP

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, thn_byr, id_pelanggan, dan id_produk 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 ORDER BY

Dengan Eksplisit Order

Untuk dapat mengaplikasikan eksplisit order, terlebih dahulu kita buat temporary table (sub query) yang mengandung klausa  WITH ROLLUP, selanjutnya urutkan data tersebut menggunakan klausa  ORDER BY  yang ada pada query utama.

Meneruskan contoh sebelumnya, kali ini kita urutkan kolom thn_byr  dari nilai  terbesar ke terkecil:

SELECT thn_byr, id_pelanggan, id_produk, jml_byr
FROM
(
	SELECT COALESCE(thn_byr, 0) as thn_byr,
			COALESCE(id_pelanggan, 'SUB TOTAL') AS id_pelanggan,
			COALESCE(id_produk, 'SUB TOTAL') AS id_produk,
			SUM(jml_byr) AS jml_byr
    FROM sales
    GROUP BY thn_byr, id_pelanggan, id_produk WITH ROLLUP
) as sales
ORDER BY thn_byr DESC, id_pelanggan, jml_byr

Output yang dihasilkan adalah:

+---------+--------------+-----------+-----------+
| thn_byr | id_pelanggan | id_produk | jml_byr   |
+---------+--------------+-----------+-----------+
|    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 |
|    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 |
|       0 | SUB TOTAL    | SUB TOTAL | 134260000 |
+---------+--------------+-----------+-----------+

Perhatikan bahwa pada baris ke 4, kita menggunakan  perintah COALESCE(thn_byr, 0) as thn_byr bukan COALESCE(thn_byr, 'TOTAL') as thn_byr.

Kita  sengaja gunakan angka 0 untuk mencerminkan  total karena thn_byr akan diurutkan mengecil sehingga angka 0 akan berada di pisisi paling bawah, jika kita gunakan COALESCE(thn_byr, 'TOTAL'), maka baris tersebut akan berada di posisi  paling atas.

3 Menggunakan LIMIT Pada WITH ROLLUP

Penggunaan klausa  LIMIT  pada  WITH ROLLUP  terkadang menghasilkan output yang tidak sesuai harapan, karena tambahan baris baru yang dihasilkan oleh kalusa  WITH ROLLUP  akan dimasukkan dalam penghitungan baris, contoh:

SELECT thn_byr, id_pelanggan, COALESCE(id_produk, 'SUB TOTAL') as id_produk, SUM(jml_byr) AS jml_byr 
FROM `sales` 
GROUP BY thn_byr, id_pelanggan, id_produk WITH ROLLUP
LIMIT 5

Output yang dihasilkan adalah:

+---------+--------------+-----------+----------+
| 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 |
+---------+--------------+-----------+----------+

Pada 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 MySQL

Menggunakan WITH ROLLUP  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:

SELECT thn_byr, id_pelanggan, id_produk, jml_byr
FROM
(
	SELECT thn_byr, id_pelanggan, COALESCE(id_produk, 'SUB TOTAL') as id_produk, SUM(jml_byr) AS jml_byr 
	FROM sales
	GROUP BY thn_byr, id_pelanggan, id_produk
	ORDER BY thn_byr DESC, jml_byr DESC
) as sales
UNION ALL
SELECT 'TOTAL', null, null, SUM(jml_byr) AS jml_byr 
FROM sales

Hasil yang kita peroleh:

+---------+--------------+-----------+-----------+
| thn_byr | id_pelanggan | id_produk | jml_byr   |
+---------+--------------+-----------+-----------+
| 2016    |            2 | 101       |  21700000 |
| 2016    |            1 | 101       |  18340000 |
| 2016    |            1 | 100       |  15225000 |
| 2016    |            2 | 100       |  10710000 |
| 2015    |            1 | 101       |  19885000 |
| 2015    |            2 | 101       |  19595000 |
| 2015    |            2 | 100       |  15145000 |
| 2015    |            1 | 100       |  13660000 |
| TOTAL   |         NULL | NULL      | 134260000 |
+---------+--------------+-----------+-----------+

Perhatikan 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 Agregasi

Penggunaan query secara manual juga memungkinkan kita untuk  melakukan berbagai fungsi agregasi.

Contoh berikut ini sedikit memodifikasi contoh sebelumya, kali ini kita akan:

  • Mengurutkan kolom thn_byr  menurun dari yang paling besar ke yang paling kecil, id_pelanggan  dari yang paling kecil ke yang paling besar, dan jml_byr  dari yang paling besar ke yang paling kecil. Semuanya  dikelompolkkan  per id_pelanggan.
  • Disamping itu, kita juga tambahkan kolom rasio yang berisi persentase nilai pembayaran dibanding jumlah seluruh pembayaran

Kode SQLnya adalah:

SELECT SUM(jml_byr) FROM sales INTO @total;

SELECT thn_byr, id_pelanggan, id_produk, SUM(jml_byr) as jml_byr, ROUND(SUM(jml_byr)/@total*100, 2) as rasio
FROM sales
GROUP BY thn_byr, id_pelanggan, id_produk
	UNION
SELECT thn_byr, CONCAT(id_pelanggan, '-SUB TOTAL'), id_produk, SUM(jml_byr) as jml_byr, ROUND(SUM(jml_byr)/@total*100, 2) as rasio
FROM sales
GROUP BY thn_byr, id_pelanggan
	UNION
SELECT thn_byr, CONCAT('TOTAL ', thn_byr), id_produk, SUM(jml_byr) as jml_byr, ROUND(SUM(jml_byr)/@total*100, 2) as rasio
FROM sales
GROUP BY thn_byr
	UNION
SELECT null, 'GRAND TOTAL', null, ROUND(@total), '100.00'
ORDER BY thn_byr DESC, id_pelanggan, jml_byr DESC

output yang dihasilkan adalah:

+---------+--------------+-----------+-----------+--------+
| thn_byr | id_pelanggan | id_produk | jml_byr   | rasio  |
+---------+--------------+-----------+-----------+--------+
|    2016 | 1            |       101 |  18340000 | 13.66  |
|    2016 | 1            |       100 |  15225000 | 11.34  |
|    2016 | 1-SUB TOTAL  |       100 |  33565000 | 25.00  |
|    2016 | 2            |       101 |  21700000 | 16.16  |
|    2016 | 2            |       100 |  10710000 | 7.98   |
|    2016 | 2-SUB TOTAL  |       100 |  32410000 | 24.14  |
|    2016 | TOTAL 2016   |       100 |  65975000 | 49.14  |
|    2015 | 1            |       101 |  19885000 | 14.81  |
|    2015 | 1            |       100 |  13660000 | 10.17  |
|    2015 | 1-SUB TOTAL  |       100 |  33545000 | 24.99  |
|    2015 | 2            |       101 |  19595000 | 14.59  |
|    2015 | 2            |       100 |  15145000 | 11.28  |
|    2015 | 2-SUB TOTAL  |       100 |  34740000 | 25.88  |
|    2015 | TOTAL 2015   |       100 |  68285000 | 50.86  |
|    NULL | GRAND TOTAL  |      NULL | 134260000 | 100.00 |
+---------+--------------+-----------+-----------+--------+

Perhatikan bahwa kita menyimpan nilai grand total (nilai yang kita gunakan untuk menghitung rasio) ke dalam variabel @total. 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 id_pelanggan.

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 Baru

Untuk 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 CONCAT(id_pelanggan, '-SUB TOTAL')  menjadi CONCAT(‘SUB TOTAL-', id_pelanggan), maka hasil yang diperoleh:

thn_byr id_pelanggan id_produk jml_byr rasio
2016 1 101 18340000 13.66
2016 1 100 15225000 11.34
2016 2 101 21700000 16.16
2016 2 100 10710000 7.98
2016 SUB TOTAL-1 100 33565000 25.00
2016 SUB TOTAL-2 100 32410000 24.14
2016 TOTAL 2016 100 65975000 49.14
2015 1 101 19885000 14.81
2015 1 100 13660000 10.17
2015 2 101 19595000 14.59
2015 2 100 15145000 11.28
2015 SUB TOTAL-1 100 33545000 25.88
2015 SUB TOTAL-2 100 34740000 24.99
2015 TOTAL 2015 100 68285000 50.86
NULL GRAND TOTAL NULL 134260000 100.00

dari tabel diatas terlihat bahwa urutannya berubah, tidak sesuai yang diharapkan. Bagaimana cara mengatasinya?

Ada cara lain yaitu menambahkan kolom baru untuk sub_total dan total, cara ini tidak sulit dilakukan jika:

  • kita tidak melakukan group (group by) dan
  • tersedia urutan  yang jelas antar row, misal ada kolom tanggal  atau id yang berurutan.

3 Membuat Temporary Index

Kondisi 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:

  1. Pertama kita akan buat temporary field bernama idx yang berisi urutan baris.
  2. Selanjutnya nilai idx tersebut kita gunakan untuk membuat query lagi sehingga  kita dapatkan  nilai tahun pada row berikutnya yang pada contoh kali ini kita simpan pada kolom idx_next_year

perintah sql nya adalah:

SET @idx=0, @idx2=0;

SELECT SUM(jml_byr) FROM sales INTO @total;
SELECT thn_byr, id_pelanggan, id_produk, jml_byr, rasio
		,@idx:=@idx+1 as idx
		,
				(      
					SELECT CONCAT(rnum, '-', thn_byr)
					FROM
					(
						SELECT thn_byr, @idx2:=@idx2+1 as rnum
						 FROM 
						 (
							 SELECT  thn_byr FROM sales GROUP BY thn_byr DESC, id_pelanggan, id_produk
						 ) as tmp
					) as tmp
					WHERE rnum > @idx AND rnum < @idx+2   
				)
			as idx_next_year
FROM (
    SELECT thn_byr, id_pelanggan, id_produk
			,SUM(jml_byr) as jml_byr
			,ROUND(SUM(jml_byr)/@total*100, 2) as rasio
    FROM sales
    GROUP BY thn_byr, id_pelanggan, id_produk
    ORDER BY thn_byr DESC, id_pelanggan
) new_sales

hasil yang kita dapatkan:

+---------+--------------+-----------+----------+-------+------+---------------+
| thn_byr | id_pelanggan | id_produk | jml_byr  | rasio | idx  | idx_next_year |
+---------+--------------+-----------+----------+-------+------+---------------+
|    2016 |            1 |       100 | 15225000 | 11.34 |    1 | 2-2016        |
|    2016 |            1 |       101 | 18340000 | 13.66 |    2 | 3-2016        |
|    2016 |            2 |       100 | 10710000 |  7.98 |    3 | 4-2016        |
|    2016 |            2 |       101 | 21700000 | 16.16 |    4 | 5-2015        |
|    2015 |            1 |       100 | 13660000 | 10.17 |    5 | 6-2015        |
|    2015 |            1 |       101 | 19885000 | 14.81 |    6 | 7-2015        |
|    2015 |            2 |       100 | 15145000 | 11.28 |    7 | 8-2015        |
|    2015 |            2 |       101 | 19595000 | 14.59 |    8 | NULL          |
+---------+--------------+-----------+----------+-------+------+---------------+

Perhatikan 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 thn_byr row berikutnya (kolom idx_next_year), kita tinggal menguji  nilai thn_byr 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:

SET @idx=0, @idx2=0;

SELECT SUM(jml_byr) FROM sales INTO @total;
SELECT thn_byr, id_pelanggan, id_produk, jml_byr, rasio
		,@idx:=@idx+1 as idx
		,CASE WHEN thn_byr =
				(      
					SELECT thn_byr
					FROM
					(
						SELECT thn_byr, @idx2:=@idx2+1 as rnum
						 FROM 
						 (
							 SELECT  thn_byr FROM sales GROUP BY thn_byr DESC, id_pelanggan, id_produk
						 ) as tmp
					) as tmp
					WHERE rnum > @idx AND rnum < @idx+2   
				)
			THEN ''
			ELSE (SELECT SUM(jml_byr) FROM sales WHERE thn_byr = new_sales.thn_byr)
			END as sub_total
		,IF (@idx = (SELECT COUNT(thn_byr) 
					FROM (SELECT thn_byr FROM sales GROUP BY thn_byr, id_pelanggan, id_produk) as tmp)
			, (SELECT SUM(jml_byr) FROM sales)
			, '') as total
FROM (
    SELECT thn_byr, id_pelanggan, id_produk
			,SUM(jml_byr) as jml_byr
			,ROUND(SUM(jml_byr)/@total*100, 2) as rasio
    FROM sales
    GROUP BY thn_byr, id_pelanggan, id_produk
    ORDER BY thn_byr DESC, id_pelanggan
) new_sales

hasil yang kita peroleh:

+---------+--------------+-----------+----------+-------+------+-----------+-----------+
| thn_byr | id_pelanggan | id_produk | jml_byr  | rasio | idx  | sub_total | total     |
+---------+--------------+-----------+----------+-------+------+-----------+-----------+
|    2016 |            1 |       100 | 15225000 | 11.34 |    1 |           |           |
|    2016 |            1 |       101 | 18340000 | 13.66 |    2 |           |           |
|    2016 |            2 |       100 | 10710000 |  7.98 |    3 |           |           |
|    2016 |            2 |       101 | 21700000 | 16.16 |    4 | 65975000  |           |
|    2015 |            1 |       100 | 13660000 | 10.17 |    5 |           |           |
|    2015 |            1 |       101 | 19885000 | 14.81 |    6 |           |           |
|    2015 |            2 |       100 | 15145000 | 11.28 |    7 |           |           |
|    2015 |            2 |       101 | 19595000 | 14.59 |    8 | 68285000  | 134260000 |
+---------+--------------+-----------+----------+-------+------+-----------+-----------+

perhatikan 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  id_pelanggan, 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 thn_byr  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. Kesimpulan

Dari pembahasan diatas dapat disimpulkan bahwa untuk menghitung total dan subtotal pada mysql, setidaknya ada tiga cara yang dapat digunakan, yaitu:

  1. Penghitungan dilakukan di level program aplikasi, seperti PHP, cara ini cenderung lebih mudah digunakan karena logika yang didukung pada bahasa level aplikasi lebih banyak daripada bahasa SQL.

    Namun demikian, sebaiknya cara ini digunakan jika query  tersebut tidak akan di jalankan  pada  aplikasi dengan bahasa pemrograman lain, karena kita harus menulis ulang (porting)  script, menyesuaikan dengan aplikasi yang baru.

  2. Menggunakan  WITH ROLLUP. Penggunaan WITH ROLLUP  lebih simpel dan mudah, namun memiliki beberapa keterbatasan diantaranya hanya terbatas untuk fungsi penjumlahan.
  3. Menggunakan penggabungan query. Cara ini lebih fleksibel dibanding menggunakan WITH ROLLUP  karena kita dapat melakukan  berbagai fungsi agregasi. Penggunaan cara ini akan membuat perintah sql menjadi lebih kompleks sehingga  terdapat potensi  menurunkan performa database.

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 Now

Suka 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.

191 Feedback dari pembaca

      • mas kalo membatasi total sks gimana ya…. minsalnya krs yang di ambil hanya bisa berjumlah 10 sks…… itu gimana ya mas…. kalo menjumlahin seluruhnya si bisa…. tapi untuk membatasi total sksnya belum bisa… mohon pencerahan nya ya mas 😀

      • maaf kakak keluar warningnya
        Warning: file_get_contents(/home/jagowebd/public_html/members/writable/session/ci_session): failed to open stream: No such file or directory in /home/jagowebd/public_html/wp-content/themes/jagowebdev/header.php on line 18

  • serius saya sangat bingung dengan keadaan penjumlahan total ini..
    tolong bantu saya donk..
    berikan scriptya yang lengkap..
    terima kasih

      • 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 —- |
        | Gula | 500 |
        | Kopi | 250 |
        | Telur | 1000 |
        |——————– | ———————— |

        Dari tabel diatas dijadikan dalam bentuk mysql dan untuk form php nya kira-kira seperti ini:

        [ ] Gula
        [ ] Kopi
        [ ] Telur

        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.

        • Coba seperti ini mas:

          <form method="post" action="">
          	<label><input type="checkbox" name="bahan[]" value="gula"/>Gula</label>
          	<label><input type="checkbox" name="bahan[]" value="kopi"/>Kopi</label>
          	<label><input type="checkbox" name="bahan[]" value="telur"/>Telur</label>
          	<input type="Submit" name="submit" value="Submit"/>
          </form>
          <?php
          if (isset($_POST['submit'])) 
          {
          	if (key_exists('bahan', $_POST)) {
          		
          		// Ambil data database
          		$conn = mysqli_connect('localhost', 'root', '', 'test');
          		$query = mysqli_query($conn, 'SELECT item, berat FROM tb_item');
          		while ($row = mysqli_fetch_assoc($query))
          		{
          			$item_db[$row['item']] = $row['berat'];
          		}
          		
          		// Loop yang dicentang
          		foreach ($_POST['bahan'] as $item_post) {
          			$berat = key_exists($item_post, $item_db) ? $item_db[$item_post] : '';
          			
          			echo 'ITEM: ' . $item_post . ' BERAT: ' . $berat . '<br/>';
          		}
          		
          	}	
          }

          Tabel:

          +-------+-------+
          | item  | berat |
          +-------+-------+
          | kopi  |   250 |
          | gula  |   500 |
          | telur |  1000 |
          +-------+-------+

          Ketika dicentang kopi sama telur, outputnya:
          ITEM: kopi BERAT: 250
          ITEM: telur BERAT: 1000

          • Terima kasih atas bantuannya, jadi saya bisa mempelajari dari contoh script yang diberikan.

            Untuk perhitungan total datanya saya mempelajari dari contoh script lain yang saya temukan sebagai bahan referensi untuk belajar.

            saya menambahkan beberapa baris dari contoh script diatas.
            Sebelum foreach
            $berat = 0;

            dan kemudian
            $berat+= $ukuran;

            setelah baris ini
            $berat = key_exists($item_post, $item_db) ? $item_db[$item_post] : ”;

            dan selanjutnya saya bisa mengkalkulasikan nilai harga dari item yang dipilih melalui checkbox.

            Sekali lagi terima kasih atas bantuannya. Jangan bosan-bosan ya mas kalau mungkin nanti saya ada pertanyaan lagi hehe..

  • Kalo penjumlahan yg di bab pertama.. bukannya g perlu disum mas… cukup $total +=$row[jml_bayar];
    Saya coba hasilnya sama mas,.
    Apakah ada pengaruhnya?

  • Tutorialnya bagus sekali mas, apa bisa saya bertanya
    Jika saya punya kolom yang menyebutkan 5 digit angka dan ingin memecah perdigitnya, pakai script seperti apa?, misalkan
    Kolom 1 isinya : 12345
    Maka otomatis 5 kolom selanjutnya berisi perdigit tersebut, jadinya:
    Kolom 2 : 1
    Kolom 3 : 2
    Kolom 4 : 3
    Dst…
    Terima kasih sebelumnya.

    • Coba menggunakan SUBSTRING mas untuk memotong teks, cuman MySQL tidak bisa benar benar dinamis artinya jika panjang teks tidak sama maka tidak bisa dihandle oleh MySQL

  • Mas klo mau menjumlahkan
    Misal
    Harga 50000
    Jumlah beli 5
    Biaya kirim 20000
    Itu script nya gmna ya
    Msh pemula mas hehe
    Trimaksh sblmnya

    • Itu sumbernya dari apa ya mas? kalau hanya variabel biasa tinggal di jumlahkan mas, misal: $total = ($harga * $jumlah_beli) + $biaya_kirim

  • mau tanya mas…
    sy punya dua tabel, table pertama deskripsi, table kedua yg mau di jumlahan…
    kasus..
    jika tabel satu kolom 2 = “Sum”
    maka tabel dua kolom 1, 2 dan tiga di jumlakan dan kolom 4 dari table 2 adalah hasil sum
    jika tabel satu kolom 2 = “Average”
    maka tabel dua 1,2 dan tiga itu dibagi dan kolom 4 tabel dua itu hasil pembagian
    jika tabel satu kolom 2 = “Last Value”
    maka tabel dua kolom 4 hanya mengambil nilai dari kolom 3 pada tabel dua

    mohon dibantu ya mas.. thanks before

      • cntohnya di ditabel penjualan ada nama_barang, qty, total_harga, tanggal_jual,
        nah mau menjumlahin total harga tapi hanya untuk 9 bulan kebelakang dari bulan sekarang
        jadi outputnya pengen tau total penjualan hanya untuk 9 bulan kebelakang mas gak seluruh bulan

        • Coba difilter menggunakan klausa WHERE mas. Dengan asumsi format kolom tanggal_jual yyyy-mm-dd dan tipe datanya date, gunakan query ini:

          SELECT nama_barang, COUNT(qty) AS jml_barang, SUM(total_harga) AS total
          FROM tabel
          WHERE 	MONTH(tanggal_jual) > MONTH(NOW()) - 9
          	AND MONTH(tgl_jual) <= MONTH(NOW())
          GROUP BY nama_barang
          
  • Mas kalau mau menjumlahkan tp dengan id pelanggan yang login gmn ya ? sy menggunakan framework CI
    Terimakasih

    • Sama saja mas, tinggal diidentifikasi apakah pelanggan tersebut sudah login. biasanya mengecek bagian session. Selanjutnya jika sudah login tingga diquery berdasarkan id pelanggan tersebut

  • 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:
    1. Beberapa item yang bisa dipilih dengan checkbox. Nama item (kopi, gula, tepung, dll) dan beratnya (dalam gram) diambil dari database mysql seperti yg sebelumnya dicontohkan.
    2. Text input seperti nama, alamat, email, dll
    3. Tampilan summary/hasil dari pengisian form tersebut. Yang ditampilkan adalah semua item yang sudah dipilih melalui checkbox, total penjumlahan berat dari semua item yang dipilih, dan semua text input yang sudah diisikan.

    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.

    • Sudah coba menggunakan fungsi mail() mas? http://php.net/manual/en/function.mail.php

      Pada file summary.php, susun hasil dalam bentuk HTML, mulai dari open tag HTML (<html>) hingga closing tag (</html>), kemudian kirim menggunakan fungsi mail(). Jangan lupa bagian header, bagian content-type dibuat text/html:

      $headers[] = 'Content-type: text/html; charset=iso-8859-1';
      

      Tambahan:
      Biasanya disetting dulu email client nya, misal dengan GMail

      • Jadi masalahnya ada di content-type nya ya? yang membuat pesan yang dikirim ke email berupa tulisan menjadi berderet seperti paragraf, bukan tersusun per baris.

        Untuk krim email saya menggunakan phpmailer (smtp), karena kalau menggunakanfungsi mail di php tidak bisa terkirim.

        Ok terima kasih untuk bantuannya.

        • Iya mas sama-sama…
          Header penting, termasuk header untuk data yang dikirim melalui protokol HTTP, karena akan mencerminkan content yang ada seperti apa, hal ini yang menjadi dasar aplikasi client (web browser, email client, dll) mengambil keputusan apa yang harus dilakukan, seperti cara menampilkan data, mendownload content, dll

  • Halo mas, saya ingin bertanya, bagaimana menambahkan data yang sudah ada di dalam database? misalnya didalam database sudah ada barang contohnya gula pasir dengan jumlah 250kg, dan saya ingin menambahkan 100kg lagi, jadi totalnya 350kg. kira-kira scriptnya seperti apa ya?

    terima kasih

  • bisa minta tolong script lengkap tuk semua tutorial diatas mas, karena saya coba sendiri dimulai dari “Menggunakan Berbagai Fungsi Agregasi” sampai “Membuat Temporary Index” GAGAL semua.. Terima kasih untuk pencerahannya

  • Gan boleh nanya ni? Caranya utk menghitung jumlah laki dan perempuan. Utk sintak mysql sama phpny gmna gan kalo di contohkan.:-) sebelumnya maaf ya gan hehehe

  • saya punya kasus perhitungan ulangan harian,
    dengan tabel :
    id_ujian int(11) primary
    id_mapel varchar(11)
    UH1 double
    UH2 double
    UH3 double
    UAS double
    UTS double

    output yang dihasilkan permapel
    avg (UH 1sampai 3) = ?
    UTS = ?
    UAS = ?

    diketahui ada 7 mapel yang berbeda
    jadi, harus dirata” ulang dari setiap mapel,

    avg (UH 1sampai 3) = ?
    UTS = ?
    UAS = ?

    mohon jawaban yang terbaik ya om….

    • Ada contoh datanya mas? dan contoh tabel hasil yang diinginkan

      Pertama:
      AVG(UH 1sampai 3) = maksudnya avg antar kolom mas? kalau antar kolom kita tidak bisa menggunakan fungsi AVG, dihitung manual: ROUND((UH1 + UH2 + UH3) / 3)
      UTS = ini formula menghitungnya seperti apa mas?
      UAS = ini formula menghitungnya seperti apa mas?

      Apa yang dimaksud seperti ini:

      SELECT ROUND((UH1 + UH2 + UH3) / 3) AS rata_rata, UTS, UAS
      FROM tabel

      Kedua:
      Sama seperti yang pertama, cuman perlu dihitung ratarata dari mapel, ini sepertinya ada row tersendiri untuk setiap mapel ya mas? kalau iya, gunakan fungsi AVG terlebih dahulu.

      Tanpa contoh data dan formula hasil yang diinginkan seperti apa agak susah mas..

  • mas klo tentang travel gmna ea mas program javascrpt yg subtotal,diskon,sama totalnya mas ,hitungnya gk bisa mas
    mkasih mas

  • Mas saya tanya untuk penambahan otomatis pada tempat duduk, jadi saya mempunyai 40 tempat duduk nilai awalnya 0, jika ada yg duduk data no_kursi ditambah 1, maka ada yg dudk pertama, jika ada yg duduk lagi maka ditambah 1 sehingga nomor kursinya 2 itu contoh script nya bagaimana ya pak ?

  • Halo Mas, mau tanya, bagaimana caranya untuk tahun dan id pelanggan jika ada lebih dari satu cukup dimunculkan hanya satu kali saja. Jadi kalau datanya sama tidak dimunculkan di setiap baris nya.
    |2015 | 1 |100 |
    101 |

    Terima kasih

  • Bila menampilkan data di 2 table dengan qty yang sama dilokasi berbeda bagaimana ya.
    Sy pnya dta

    Id kode jumlh lokasi  jml eceran
    1  iia  10000 a-a-01  5000
                  A-a-04      5000
    

    Id kode dan jumlh diambil dari table a dan lokasi jml eceran dari table b
    Id kode dan jumlah diketik pengguna tapi lokasi jml eceran terisi otomatis dengan jumlah 10000 yang diketik pengguna munculah angka 5000 dan 5000 secara otomatis
    Terima kasih

  • Assalamualaikum mas, mas saya mau tanya, saya lg belajar bikin database inventory, yg ingin saya tanyakan gimana cara ny mengurangi jumlah barang apa bila barang sedang dipinjam?jadi pada saat ada yg minjem barang stok berkurang, dan sebaliknya..mohon jwbn ny makasih

  • kalo mau begini gimana mas phpnya.

    | ruangan | kapasitas |
    | toilet  | 100 |
    | toilet  | 200 |
    | subtot  : 300 |
    | musholah | 200 |
    | subtot : 200 |
    | lab | 10 |
    | lab | 15 |
    | lab | 5 |
    | subtot : 30 |
    

    jadi setiap ruangan ada subtotnya mas, ditunggu ya mas via email juga boleh dianarifr@gmail.com . terima kasihz

  • Mas Mau tanya aku gimana untuk penyelesaian untuk tabel seperti ini

    tabel bayar
    |bulan|Tanggal Bayar|Total|
    |2016.04|05/05/2016|90000|
    |2016.04|07/05/2016|60000|
    |2017.08|01/07/2016|80000|
    
    tabel tagih
    |bulan|Tagihan|
    |2016.04|90000|
    |2016.04|60000|
    |2017.08|80000|
    

    aku ingin menghitung total jadi seperti ini

    | bulan | Jumlah Tagih | Jumlah Bayar |
    |2016.04 | 160000 | 160000|

    yang jadi masalah cara gabungkan query nya gimana antara tabel tagih dan tabel bayar, masalah kedua tabel ( ” tanggal bayar ” ) berupa varchar dan cara konversi ke tanggal contoh ” 01-02-2016 ” bagaimana caranya… terima kasih sebelumnya mas..

    • Coba query ini mas:

      SELECT bulan, SUM(tagihan) AS jumlah_tagih, SUM(total) AS jml_bayar
      FROM bayar
      LEFT join tagih USING(bulan)
      GROUP BY bulan
      

      Untuk mengubah format tanggal bisa menggunakan fungsi STR_TO_DATE mas, fungsi tersebut akan mengubah tanggal ke dalam format MySQL yyyy-dd-mm. selanjutnya untuk mengubahnya menjadi format yang diinginkan dd-mm-yyyy, gunakan fungsi DATE_FORMAT

  • gan, gimana cara menjumlahkan total dari subtotal pada controller codeigniter ? mohon bantuannya agan-agan sekalian. terimakasih.

  • Mas mau tanya, misal data yang sudah di tampilkan dari mysql, terus di tampilkan ke dalam bentuk table,bagaimana mengambil value table tersebut mas untuk dilakukan perhitungan kembali?

  • gan bisa kasi contoh script buat “I. Menghitung Total dan Subtotal Pada MySQL dengan PHP” di hal. web atas agan ini tapi pake mysqli.
    ane ga paham script PDO.
    ato agan buat contoh yang simple aja. dengan mysqli / pdo ato yang lain, jadi pengunjung web agan banyak pilihan.

    • untuk mysqli tinggal gunakan fungsi mysqli_query(), coba seperti ini mas:
      $sql = ‘SELECT…’;
      $query = mysqli_query($conn, $sql);
      while($row = mysqli_fetch_assoc($query)) {
      echo $row[‘nama_kolom’]
      }

  • mas agus.. kalo yang output nya pertahun kodenya bagaimana?
    saya ingin menjumlah tahun 2015 nya saja.
    ada 4 kolom:

    | thn_byr  | id_user | jml_transaksi | total_pembayaran           |
    +----------+---------+---------------+----------------------------+
    |    2015  | adi     | 4 kali        |          40,000            | 
    |    2015  | budi    | 2 kali        |          20,000            | 
    |    2015  | tono    | 3 kali        |          30,000            |
    |    2015  | jarwo   | 2 kali        |          20,000            | 
    +----------+---------+---------------+----------------------------+
                                 jumlah_pembayaran :    110,000
    
    • tinggal di group by id_user sama wherenya di filter tahun 2015 mas, kira kira seperti ini:

      SELECT thn_byr, id_user, COUNT(jml_bayar) AS jml_transaksi, SUM(jml_byr) AS total_pembayaran
      FROM tabel
      GROUP BY id_user
      WHERE YEAR(tgl_byr) = 2015
  • Mas, minta tolong masukkan database nya dimana??
    kan hanya dimasukkan tabel nya tapi database nya tidak ada
    maan masih pemula

  • mas.. saya mau bertanya nih. ada kasus perhitungan ulangan harian siswa untuk menghitung jawaban nya secara otomatis dengan meng-input data.
    cara kerja nya begini :
    1. input pertama kunci jawaban di sebuah kolom atau tabel vertikal
    2. input jawaban dari siswa di kolom vertikal disamping kolom kunci jawaban.
    3. hitung jawaban yang benar berapa.
    4. bentuk dari jawaban siswanya multiple choice.
    5. langsung kelihatan berapa benar dan salahnya mas
    gimana cara buatnya ya mas..
    mohon bantuan nya

    • Untuk data permanen, kunci jawabannya dan jawaban siswa bisa dissimpan dulu di database mas.
      Sebaiknya di buat tabel terpisah, misal:
      Tabel kunci_jawaban
      soal_no jawaban
      1 A
      2 C

      jawaban_siswa
      kd_siswa no_soal jawaban
      A12 1 A
      A12 2 D

      Untuk menghitung jawaban yang benar, dengan SQL bandingkan kunci dan jawaban, beri nilai 1 untuk jawaban benar dan NULL untuk jawaban salah, selanjutnya hitung yang benar dan yang salah menggunakan fungsi SUM atau COUNT

  • Selamat sore Pak, saya ada kasus report seperti ini :

    -------------------------------------------
    id_produck           |    jml_byr
    -------------------------------------------
    Tahun 2015
    -------------------------------------------
    1   Pelanggan 1
    -------------------------------------------
      100                     |  13.660.000
      101                     |  19.885.000
    -------------------------------------------
       TOTAL                   33.545.000
    -------------------------------------------
    1   Pelanggan 2
    -------------------------------------------
      100                     |  15.145.000
      101                     |  19.595.000
    -------------------------------------------
       TOTAL                   34.740.000
    -------------------------------------------
      TOTAL 2015          68.285.000
    -------------------------------------------
    
    Tahun 2016
    -------------------------------------------
    1   Pelanggan 1
    -------------------------------------------
      100                     |  15.225.000
      101                     |  18.340.000
    -------------------------------------------
       TOTAL                   33.565.000
    -------------------------------------------
    1   Pelanggan 2
    -------------------------------------------
      100                     |  10.710.000
      101                     |  21.700.000
    -------------------------------------------
       TOTAL                   32.410.000
    -------------------------------------------
      TOTAL 2016          65.975.000
    -------------------------------------------
    GRAND TOTAL      134.260.000
     

    Mohon pencerahan nya. Terima kasih
    Leo

  • mas mau nanya script phpnya donk tolong di bantu ya
    jadi kan gini, pada web yang saya mau bikin itu, ketika kita mengklik nama barang, muncul otomatis jenis, satuan, harga minggu1, minggu2, minggu3, minggu4, dan minggu5, nah yang saya mau tanyakan adalah
    script untuk hitung otomatis buat harga rata-rata dari harga minggu1, minggu2, minggu3, minggu4, dan minggu5, itu gmna mas, harga minggu ke 1 – ke 5 nya sdh muncul secara otomatis dari pemilihan nama barang tadi tinggal memunculkan harga rata-ratanya aja lagi yang kurang paham, terimakasih.

    • Bisa langsung dari SQL atau dari PHP mas, tinggal ditambahkan minggu 1 s.d 5 terus dibagi 5
      SQL:

      SELECT harga, (minggu_1 + minggu_2 + minggu_3 + minggu_4 + minggu_5) / 5 AS rata_rata
      FROM tabel

      PHP:

      $rata_rata = ($row['minggu_1'] + $row['minggu_2'] + $row['minggu_3'] + $row['minggu_4'] + $row['minggu_5']) / 5;
  • Mas Bisa bantu tentang penjumlahan di simpan koperasi
    misalnya saya punya tabel 3 yaitu anggota,jenis,simpanan
    nah yang jenis sama anggota itu ngerelasi ke tabel simpanan
    isi tabel simpanan yakni id,id_anggota,id_jns_simpanan,jumlah_simpan,total simpan
    tolong bantu ya mas

  • mas agus.. mau nanya nih..
    saya punya tabel penjualan.. dengan datanya ada 15 record dalam bulan Januari 2018. Kalau saya panggil untuk ditampilkan dalam bentuk tabel kan cuma ada 15 tanggal dengan data penjualan.
    pertanyaannya:
    Saya ingin menampilkan tabel dengan tampilan tabel bulan januari 2018 dengan data tgl 01 s/d 31(akhir bulan).
    Untuk kolom tanggal, tampil dari tgl. 01 s/d 31 dan kolom penjualan terisi dengan jmlh penjualan sesuai inputan, sedang yang tidak ada inputan jumlah penjualannya akan terisi 0.
    mohon pencerahaanya dengan contoh skrip mas..
    terimakasih sebelumnya.

    • Coba ambil data seperti biasa menggunakan query dan hasilnya disimpan ke dalam array, kemudian untuk tanggalnya ditampilkan semua dengan php, selanjutnya di cek di array tersebut apakah di tanggal tersebut ada datanya, misal:

      
      $con = mysqli_connect('localhost', 'root', 'pass', 'db');
      $query = mysqli_query($conn, 'SELECT * FROM tabel');
      while($row = mysqli_fetch_assoc($query)) {
      	$data[$row['tanggal']] = $row['nama'];
      }
      
      $tahun = '2018';
      $jml_hari = date('n');
      for($i=1, $i<=$jml_hari, $i++) {
      	// dua digit tanggal
      	$tgl = substr('0' . $i, -2);
      	$tgl_full = $tahun . '-' . $bulan . '-' . $tgl;
      	if (key_exists($tgl_full, $data)) {
      		echo $data[$tgl_full];
      	} else {
      		echo 0;
      	}
      }
    • Untuk display bisa disiasati di level presentasinya mas, misal dengan php, sebelum di tampilkan datanya, di tampilkan dulu totalnya, atau dengan query MySQL bisa menggunakan union dengan query totalnya diletakkan di atas.

  • Assalamualaikum, mas mohon bantuannya,
    saya punya tabel kabkot seperti ini :

    | thn_byr  | id_user | jml_transaksi | total_pembayaran           |
    +----------+---------+---------------+----------------------------+
    |    2015  | adi     | 4 kali        |          40,000            | 
    |    2015  | budi    | 2 kali        |          20,000            | 
    |    2015  | tono    | 3 kali        |          30,000            |
    |    2015  | jarwo   | 2 kali        |          20,000            | 
    +----------+---------+---------------+----------------------------+
                                 jumlah_pembayaran :    110,000
    
  • boleh minta contohnya mas menggunakan php,,
    karena nilai subtotal pertama nilainya kosong, sedangkan subtotal kedua menampilkan nilai subtotal pertama,,

    result() as $data )
    { 	
    	$subtotalPokok +=$data->Pokok;
    	if ($kodeunit!=	$data->namaunit)
    	{							
    	?>
    		namaunit; ?>			
    	namaunit;
    	$subtotalPokok=0;
    	}  
    }	
    >
    

    Pokok;
    $rupiah = number_format($nominal, “0”, “,”, “.”);
    echo $rupiah; ?>

    • Jika dibut dari sisi aplikasi, memang harus di loop dulu hasilnya untuk mendapatkan jumlah total datannya mas:

      $subtotalPokok = 0;
      while($row = mysqli_fetch_array($query)) {
      	$subtotalPokok += $row['pokok'];
      }
      
      while($row = mysqli_fetch_array($query)) {
      	echo $row['data'];
      }
      echo $subtotalPokok;

      Agar lebih efisien, total data bisa dibuat menggunakan fungsi SUM pada sql

  • Selamat malem mas, mau tanya bagaimana cara menjumlahkan sebuah kolom yang ditampilkan menggunakan do…while…supaya hasil yang ditampilkan sesuai jumlah baris yang ditampilkan, bukan jumlah keseluruhan baris?
    misal ada 10 data, tiap data memiliki nilai 10 jadi jumlah keseluruhan adalah 10×10=100, tapi masalahnya saya mau menampilkan 5 data saja, sisanya saya tampilkan dihalaman berikutnya, jadi halaman pertama jumlahnya harusnya 50 dari total jumlah 100, caranya kira2 gimana mas? semoga bisa dipahami pertanyaannya ya mas, bingung jelasinnya hehehe….thanks b4

  • malam mas, saya ada beberapa pertanyaan.. kiranya sudi membantu.
    saya punya database seperti dibawah ini:

    -----------------------------------------------------------------------------------------------
    id     |   Asal                       |    Tujuan                              |  Tarif
    -----------------------------------------------------------------------------------------------
    01     | kota A                       |    Kota A                              | 5000
    02     | Kota A                       |    Kota B                              | 7000
    03     | Kota A                       |    Kota C                              | 10000
    04     | Kota A                       |    Kota D                              | 12000
    05     | Kota B                       |    Kota A                              | 7000
    06     | Kota B                       |   Kota B                               |  5000
    07     | Kota B                       |   Kota C                               | 4000
    08     | Kota B                       |   Kota D                               |  6000
    ------------------------------------------------------------------------------------------------
    

    kemudian untuk di tampilan webnya saya ingin ada 1 combo box dan 2 text box,
    1. combobox asal (dengan opsi Kota A dan Kota B yang didapat dari query database kolom Asal)
    2. textbox tujuan dengan autocomplete (yang didapat dari query database kolom Tujuan)
    3. Textbox Harga yang menampilkan hasil tarif perhitungan otomatis dari asal & tujuan

    mohon bantuannya untuk script PHP yang simple untuk model diatas.
    sebelumnya saya ucapkan terimakasih.

    • Script PHP nya panjang mas:
      1. Untuk membuat combobox dari database, bisa mempelajari artikel ini: JSON Pada Javascript – Panduan Lengkap Demonya: Javascript Combo Dynamic

      2. Maksudnya Input box dengan autocomplete ya mas? itu perlu javascript untuk menangkap event keyup mas, sesaat setelah keyboard selesai dipencet, selanjutnya digabungkan dengan AJAX ke halaman php yang berisi prediksi kata. Halaman php tersebut melakukan query ke database.

      Namun biasanya isi lemot mas, lebih efektif jika data tersebut sudah diambil terlebih dahulu dari database kemudian disimpan pada variabel javascrit kemudian baru ditampilkan ketika terjadi event keyup

      3. Untuk perhitungan otomatis ini juga perlu Javascript mas, menggunakan event keyup juga, jadi sesaat setelah selesai keyboard diketik, script melakukan penghitungan dari input asal dan tujuan

      Semoga dapat membantu…

  • 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…

    $query=mysql_query("SELECT a.toko_code as code,a.nama_toko as nama,substring(a.nm_organ4,-4,3) as am,substring(a.nm_organ5,-4,3) as s ,b.prdcd as plu FROM $pilih b JOIN $mtoko a ON b.shop=a.toko_code where b.prdcd='$cari' and b.tanggal between '$tanggal_awal' and '$tanggal_akhir' union
    SELECT a.toko_code as code,a.nama_toko as nama,substring(a.nm_organ4,-4,3) as am,substring(a.nm_organ5,-4,3) as s, b.prdcd as plu FROM $pilih1 b JOIN $mtoko a ON b.shop=a.toko_code where b.prdcd='$cari' and b.tanggal between '$tanggal_awal_1' and '$tanggal_akhir_1' union
    SELECT a.toko_code as code,a.nama_toko as nama,substring(a.nm_organ4,-4,3) as am,substring(a.nm_organ5,-4,3) as s, b.prdcd as plu FROM $pilih2 b JOIN $mtoko a ON b.shop=a.toko_code where b.prdcd='$cari' and b.tanggal between '$tanggal_awal_2' and '$tanggal_akhir_2'group by prdcd,shop");
    $jumlah =mysql_query("SELECT avg(b.sls_qty) as spd1 FROM $pilih b JOIN $mtoko a ON b.shop=a.toko_code where b.prdcd IN ('$cari') and b.tanggal between '$tanggal_awal' and '$tanggal_akhir' group by shop,prdcd");
    $jumlah1 =mysql_query("SELECT avg(b.sls_qty) as spd2 FROM $pilih1 b JOIN $mtoko a ON b.shop=a.toko_code where b.prdcd  IN ('$cari') and b.tanggal between '$tanggal_awal_1' and '$tanggal_akhir_1' group by shop,prdcd");
    $jumlah2 =mysql_query("SELECT avg(b.sls_qty) as spd3 FROM $pilih2 b JOIN $mtoko a ON a.toko_code=b.shop where  and b.prdcd IN ('$cari') and b.tanggal between '$tanggal_awal_2' and'$tanggal_akhir_2' group by shop,prdcd");
    $hasil = ($jumlah['spd1']+$jumlah1['spd2']+$jumlah2['spd3']);
    
    switch ($hasil) {
    	case ($jumlah > 0 && $jumlah1 > 0 && $jumlah2 > 0):
    		$hasil = ($jumlah['spd1']+$jumlah1['spd2']+$jumlah2['spd3'])/3;
    		break;
    	case ($jumlah == 0 && $jumlah1 > 0 && $jumlah2 > 0):
    		$hasil = ($jumlah1['spd2']+$jumlah2['spd3'])/2;
    		break;
    	case ($jumlah == 0 && $jumlah1 == 0 && $jumlah2 > 0):
    		$hasil = ($jumlah2['spd3']);
    		break;
    	case ($jumlah >0 && $jumlah1 > 0 && $jumlah2 == 0):
    		$hasil = ($jumlah['spd1']+$jumlah1['spd2'])/2;
    		break;
    	case ($jumlah >0 && $jumlah1 ==0 && $jumlah2 == 0):
    		$hasil = ($jumlah['spd1']);
    		break;
    	case ($jumlah  ==0 && $jumlah1 > 0 && $jumlah2 == 0):
    		$hasil = ($jumlah1['spd2']);
    		break;
    	case ($jumlah >0 && $jumlah1 == 0 && $jumlah2 >0):
    		$hasil = ($jumlah['spd1']+$jumlah2['spd3'])/2;
    		break;
    }
    
     pagi pak saya mau menampilkan data seperti ini
    code 
    supaya lebih efektif gimana ya pak saya mau menampilkan
    +------------------------------------------------------------------------------------------------
    ||code || nama || am || as || prdcd ||spd1||spd2||spd3 ||rata-rata spd ||
    karena kalo pakk if penggunaan avg gak bisa ya pak ?
    
    mohon bantuannya untuk script PHP yang simple untuk model diatas.
    sebelumnya saya ucapkan terimakasih.
  • misalnya ini ada table puskesmas cara cara untuk Menghitung dan menampilkan jumlah pendaftaran tiap2 puskesmas itu cemana ya mas?

  • mas bisa bantu untuk penghitungan nilai kuesioner dosen. misal tabel id_hasil kolomnya ada id_hasil, id_mhs, id_dsn, id_matkul, kuis1, kuis2, kuis3, kuis4, kuis5. bagaimana caranya mas menjumlahkan lalu di rata-ratakan cuman yg kolom kuis1 dari banyaknya mahasiswa yang menilai satu id_matkul. tolong bantu mas secepatnya.

    • Kalau model seperti itu menjumlahkannya manual mas, misal: select ( col1+col2+col3) / 3

      Desain tabel seperti ini kurang tepat, seharusnya kolom nilai hanya ada satu, mencari rata ratanya tinggal pakai fungsi AVG

      coba pelajari lagi tentang desain database

  • tanggal_beli kode_barang jumlah total
    01/08/2018 BAR017 182 25470
    01/08/2018 BAR023 890 22205
    01/08/2018 BAR029 1000 105000
    01/08/2018 BAR040 1000 67500
    01/08/2018 BAR041 1000 52500
    01/08/2018 BAR069 1000 57500
    01/08/2018 BAR070 1000 70000
    01/08/2018 BAR090 21 9500
    01/08/2018 SUB TOTAL 21 409675
    02/08/2018 BAR001 24000 402000

    mas saya coba select data menggunakan COALESCE untuk meghitung TOTAL dan SUB TOTAL, nah pada bagian SUB TOTAL bagaimana cara menghilangkan nilai cell jumlah pada baris SUB TOTAL itu, seperti contoh ini 01/08/2018 SUB TOTAL 21 409675 supaya nilai 21 di kolom jumlah itu gak muncul mas..

  • Permisi mas agus saya mau tanya saya memakai framework laravel, saya ingin membuat halaman dashboard yg datanya diambil dari “table dashboard database”..didalam “table dashboard database” isi setiap kolomnya adalah “Penjumlahan/SUM” dari “table database stock,barangrusak,baranghilang”..bagaimana kodingan menjumlah nya ? terimakasih

  • mohon pencerahan mas
    Saya mau buat query dari 4 tabel dibawah

    Struktur Tabel:

    T.user:
    iduser | Nama    |
    -------|------   |
    001    | Andi    |
    002    | Rian    |
    
    Tscore
    id    |  vt   |   vo   |   pkg   |   sub   |
    ------|-------|--------|---------|---------|
    1     |   1   |    1   |    2    |   5     |    
    

    Trus tabel data yg diinput kayak gini:

    Tabel 1:
    
    id  |  vt  |  deskripsi  |  iduser  |
    ---------------------------------------------
    1   |   1  | Buat soal   | 001      |
    ---------------------------------------------
    2   |   1  | Buat video  | 002      |
    
    
    Tabel 2:
    
    id  |  vo  |  deskripsi   |  iduser  |
    ---------------------------------------------
    1   |   1  | Buat video   | 001      |
    ---------------------------------------------
    2   |   1  | Buat soal    | 002      |
    
    
    Tabel 3:
    
    id  |pkg |  deskripsi  |  iduser  |
    ---------------------------------------------
    1   |   1  | Buat soal | 001      |
    ---------------------------------------------
    2   |   1  | Buat video| 002      |
    
    
    Tabel 4:
    id  |sub |  deskripsi  |  iduser  |
    ---------------------------------------------
    1   |   1  | Buat soal | 001      |
    ---------------------------------------------
    2   |   1  | Buat video| 002      |
    

    Pertanyaannya 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

    iduser |  vt  |  vo  |  pkg  |  sub  |
    -------|------|------|-------|-------|
    001    |  1   |  1   |   1   |   1   |
    002    |  1   |  1   |   1   |   1   |
    -------|------|------|-------|-------|
    total  |  2   |  2   |   2   |   2   |
    -------|------|------|-------|-------|
    Score  |  2   |  2   |   4   |   10  |
    --------------------------------------
    Sub total :  18                      |
    --------------------------------------
    

    mohon pencerahan mas

    • Coba menggunakan join mas untuk tabel hasil diatas total, sedangkan untuk total dan score bisa dibuat melalui query tersendiri kemudian dengan union digabungkan dengan tabel hasil sebelumnya

  • mas agus saya punya tabel database sperti ini

    +————+———+———+——-+——-+——+———+—————+
    | tanggal | nik | absensi | hadir | sakit | ijin | mangkir | total_absensi |
    +————+———+———+——-+——-+——+———+—————+
    | 2017-11-29 | 3453464 | H | 1 | 0 | 0 | 0 | 1 |
    | 2017-11-30 | 3453464 | H | 1 | 0 | 0 | 0 | 1 |
    | 2018-10-30 | 3453464 | H | 1 | 0 | 0 | 0 | 1 |
    | NULL | 3453464 | H | 1 | 0 | 0 | 0 | 1 |
    +————+———+———+——-+——-+——+———+—————+

    di tanggal yang sama 1orang memungkinkan absensi 2x atau lebih karena absensi di hitung setiap 3 jam sekali, dalam query saya menggunakan distinct untuk menghitung angka yang sama, tapi dalam jumlah akhir ko malah keliru ya, harusnya total_absensinya 3, ini ko malah 1?

    mhon bimbingannya mas agus

  • malam mas Agus, saya mau tanya gimana caranya untuk menghitung total jumlah nilai yang ada di 2 kolom yang berbeda dalam database xampp, sebagai contoh :
    +————+———+———+——-+——-+——+———+—————+
    | id | nama | urut1 | urut2 | urut3 |urut4 | status| user |
    +————+———+———+——-+——-+——+———+—————+
    | 1 | arif | 2 | 1 | 0 | 0 | Y | admin |
    | 2 | ajun | 3 | 3 | 5 | 8 | Y | admin |
    | 3 | bima | 2 | 44 | 31 | 2 | Y | personal |
    | 4 | cindy | 5 | 1 | 3 |7 | Y | personal |
    +————+———+———+——-+——-+——+———+—————+
    bagaimana cara php menjumlahkan kolom urut1 + urut2 + urut3 + urut4 dengan cara pengulangan?
    mohon pencerahannya mas, terimakasih sebelumnya mas Agus

    • Maksudnya dengan cara pengulangan bagaimana mas?
      Untuk menjumlahkan nilai kolom bisa langsung menggunakan operator + pada query, misal:
      SELECT nama, urut1 + urut2 + urut3 + urut4 AS total

  • jml penerimaan tgl
    51 PUSKESMAS 2018-01-02
    15 DOKTER PRAKTEK 2018-01-02
    78 PUSKESMAS 2018-01-03
    20 DOKTER PRAKTEK 2018-01-03

    Met pagi pak agus, saya mau menanyakan bagaiaman caranya memisah hasil jumlah dan penerimaanx tersendiri, sehingga hasilx jml1,jml2, penerimaan1,penerimaan2,tgl ??

    berikut querry yg sudah sya buat :

    SELECT
    count(k.cara_penerimaan) as jml,
    ra.penerimaan,
    to_char(k.tgl_masuk, ‘YYYY-MM-DD’) as tglmsk2

    FROM
    ((
    pasien ps
    LEFT JOIN perusahaan prs ON prs.kd_perusahaan = ps.kd_perusahaan
    )
    LEFT JOIN pekerjaan pk ON ps.kd_pekerjaan = pk.kd_pekerjaan
    )
    INNER JOIN ( Kunjungan K INNER JOIN unit u ON K.kd_unit = u.kd_unit ) ON K.Kd_Pasien = ps.Kd_Pasien
    LEFT JOIN Rujukan r ON r.kd_Rujukan = K.kd_Rujukan
    INNER JOIN CUSTOMER C ON K.kd_customer = C.kd_customer
    inner join rujukan_asal ra on ra.cara_penerimaan = r.cara_penerimaan::varchar
    WHERE k.tgl_masuk BETWEEN ‘2018-01-01’ AND ‘2018-01-31′
    — ( K.Tgl_Masuk >= ’11/Oct/2018’ AND K.Tgl_Masuk <= '11/Oct/2018' )
    AND k.cara_penerimaan IN ('1','4')
    AND ra.cara_penerimaan ‘2’
    AND K.kd_Unit IN (‘202′,’203′,’204′,’206′,’207′,’209′,’210′,’211′,’212′,’213′,’214′,’216′,’217′,’218′,’220′,’223′,’224′,’237′,’255′,’256’)
    GROUP BY k.cara_penerimaan, ra.penerimaan, k.tgl_masuk
    ORDER BY k.tgl_masuk ASC

  • Tanggal Transaksi Pengeluaran Total
    01-02-2019 12.000,00 0,00 12.000,00
    02-02-2019 0,00 3.000,00 9.000,00
    03-02-2019 10.000,00 0,00 19.000,00

    selamat siang mas,, kalau saya mau bikin tabel seperti diatas bagaimana ya caranya diphp dan sql ?
    jadi total + transaksi = total, dan total-pengeluaran = total.
    mohon pencerahannya mas.

  • Halo Mas..
    Tutorialnya bermanfaat banget..
    oh iya mohon pencerahannya mas.. klo misalnya thn_byr dan id_pelanggan di merge kayak gini bisa ga ya?

    +---------+--------------+-----------+----------+-------+------+-----------+-----------+
    | thn_byr | id_pelanggan | id_produk | jml_byr  | rasio | idx  | sub_total | total     |
    +---------+--------------+-----------+----------+-------+------+-----------+-----------+
    |    2016 |            1 |       100 | 15225000 | 11.34 |    1 |           |           |
    |         |              |       101 | 18340000 | 13.66 |    2 |           |           |
    |         |            2 |       100 | 10710000 |  7.98 |    3 |           |           |
    |         |              |       101 | 21700000 | 16.16 |    4 | 65975000  |           |
    |    2015 |            1 |       100 | 13660000 | 10.17 |    5 |           |           |
    |         |              |       101 | 19885000 | 14.81 |    6 |           |           |
    |         |            2 |       100 | 15145000 | 11.28 |    7 |           |           |
    |         |              |       101 | 19595000 | 14.59 |    8 | 68285000  | 134260000 |
    +---------+--------------+-----------+----------+-------+------+-----------+-----------+
    
  • Selamat Pagi Mas, maaf mas mau nanya
    scrip saya ini membaca hanya tahun 2017

    SELECT nm_dusun, jenkel,
    COUNT(IF(YEAR(tgl_periksa) = 2018 AND jenkel =’Pria’, 1, NULL)) AS pthn2018,
    COUNT(IF(YEAR(tgl_periksa) = 2018 AND jenkel =’Wanita’, 1, NULL)) AS wthn2018
    FROM tbl_dusun, tbl_pasien
    WHERE tbl_dusun.id_dusun=tbl_pasien.id_dusun GROUP BY nm_dusun”);

    bagaimana cara aga secara automatis ketika ada penambahan data untuk tahun 2019, sehingga tahunnya secara otomatis bertambah. Tks Mas

  • terima kasih tutorial nya mas….
    kalau untuk menghitung nilai rata dengan beberapa kolom gimana mas?
    contoh tabel:
    id_nilai | nis |mapel | uh1 |uh2 |uh3 |uh4 |uh5 |rata_uh |n1 |n2 |n21 |rata_n

    bagaimana cara menghitung nilai rata_uh dan rata_n

    terima kasih sebelumnya.

    • Itu desain tabelnya salah mas, sehingga tidak bisa menggunakan fungsi AVG bawaan SQL, melainkan harus memnggunakan operator + secara manual SELECT (uh1 + uh2 + uh3)/3 FROM tabel

  • mas agus tolong di bantu

    Tanggal
    Nama
    Biaya

    hasilnya

    Tanggal Nama Biaya
    2019-06-28 Kadek 300000
    2019-06-28 AriSukma 300000
    2019-06-29 Derik 150000

    Biar gini gimana ya mas agus
    Tanggal Nama Biaya
    2019-06-28 Kadek 300000
    2019-06-28 AriSukma 300000
    Total 600000

    Terima Kasih.

  • maaf spam mas agus, saya mau ngirim codingannya tidak bisa, tidak muncul di komen,
    jadi saya kirim lewat gmail juga pak agus
    Biar gini gimana ya mas agus klik filter lalu muncul tgl yang di filter dan total biaya

    PILIH TANGGAL (mm/dd/yyyy) filter

    Tanggal Nama Biaya
    2019-06-28 Kadek 300000
    2019-06-28 AriSukma 300000
    Total 600000

  • Pak Agus ..Mau tanya…Kalau misal saya mau menampilkan data ke tabel php, setiap tabel berisi 25 row, yang saya mau tanyakan ,bagaimana menjumlahkan setiap 1 halaman tabel, jadi kalau misal outputnya 2 tabel dalam satu tabel itu ada jumlah masing tabel…terima kasih sebelumnya

  • pak agus saya mau bertanya , saya kan ada 3 form
    1. form barang
    2. form in
    3. form out
    disuruh form barang bisa bertambah dan berkurang , saya pake php native. saya tidak tahu skrip codenya tapi di form in sama form out tetap input QTY. Mohon di jawab pak ,secepatnya

  • maaf mas mau nanya saya punya data seperti di bawah:

    SELECT barang.kd_barang,barang.nm_barang,barang.stok,SUM(jumlah) AS total_keluar
    FROM penjualan_item
    right join penjualan on penjualan_item.no_penjualan=penjualan.no_penjualan
    right join barang on penjualan_item.kd_barang=barang.kd_barang
    GROUP BY barang.kd_barang asc;

    SELECT barang.kd_barang,barang.nm_barang,SUM(jumlah) AS total_masuk
    FROM pembelian_item
    right join pembelian on pembelian_item.no_pembelian=pembelian.no_pembelian
    right join barang on pembelian_item.kd_barang=barang.kd_barang
    GROUP BY barang.kd_barang asc;

    jika say run secara terpisah hasilnya akan benar untuk hasil SUM akan tetapi jika saya gabungkan hasil dari SUM itu hasilnya akan berbeda bahkan ada yang di kali 2
    semoga bisa di bantu mas, terima kasih.

  • Saya masih bingung dalam pengupdaten data yang akan di SUM kemudian hasil SUM tersebut otomatis masuk ke tabel yang lainnya. Mohon pecerahannya om jika saya punya 2 tabel seperti ini:
    https://www.flickr.com/photos/186512472@N04/49397526362/

    bagaimana caranya supaya kanguru1 di tabel 1 tersebut jika di update datanya maka otomatis menjumlahkan kanguru1 menjadi total di tabel yang kedua? begitu juga kanguru 2 dan kanguru 3

  • pak agus saya mau bertanya bagaimana cara membuat multigudang untuk menampilkan stok disetiap gudang ya , jadi misalkan barang 1 ada dibeberapa gudang akan tampil jumlah pada gudang tersebut . dan gudang tersebut ada master gudanya dari database pak mohon pencerahanya pak

  • pak agus
    saya mencoba dengan opsi yang pertama
    tetapi nama tabelnya mengambil dari variabel, saya tes variabelnya pada query, notif errornya tidak terindex (mungkin saya salah sintaxnya)
    sudah saya pastikan nama variabelnya muncul ketika di echo

    isset($_GET[‘users’]);
    $users = $_GET[‘users’];
    echo “$users”;

    try {
    $pdo = new PDO( ‘mysql:host=’.$db_host.’;port=’.$db_port.’;dbname=’.$db_name , $db_user, $db_pass, array(PDO::MYSQL_ATTR_LOCAL_INFILE => 1) );
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
    catch(PDOException $e)
    {
    $errMessage = ‘Gagal terhubung dengan MySQL’ . ‘ # MYSQL ERROR:’ . $e->getMessage();
    die($errMessage);
    }
    $sql = ‘SELECT id,grup,noper,naper,SUM(saldo) as saldo,SUM(debet) as debet,SUM(kredit) as kredit,SUM(akhir) as akhir
    FROM $users where (saldo 0 or debet 0 or kredit 0 or akhir 0)
    GROUP BY id,grup,noper’;

    pesan errornya : Uncaught exception ‘PDOException’ with message ‘SQLSTATE[42S02]: Base table or view not found: 1146 Table ‘patra_new.$users’ doesn’t exist’

    mohon bantuannya pak
    terima kasih

  • cara menghiting saldo Kas gimana ya Mas misal :
    keter |masuk |keluar | saldo
    1.pinjem duit | 1000 | 0 | 1000
    2.beli Nasi | 0 | 200 | 800
    3.Beli rokok |0 |100 | 700

    gimna ya ,bisa di emailka sutoyo.purmer@gmail.com

  • Terimakasih, sangat membantu saya dlm pengerjaan tugas dan cukup lengkap informasinya, sangat terbantu sekali

  • bisa tolong bantu?
    saya mempunyai 2 table ms_produk dan tr_penjualan

    tabel ms_produk berisi no_urut,kode_produk,nama_produk

    tabel tr_penjualan berisi kode_transaksi, kode_produk, qty

    saya ingin menampilkan kode_produk,nama_produk,total_qty dimana total qty hanya di tampilkan yang paling besar/yang paling banyak.
    tetapi jika ada total_qty bernilai sama maka semua nilai total_qty yang paling besar di tampilkan semua.

    contoh:
    total_qty
    12
    13
    13
    10
    9
    9
    7
    maka yang akan tampil adalah
    total_qty
    13
    13

  • Mas saya mau tanya, untuk mencari selisih dari 2 kolom dalam 1 baris dengan datanya time atau jam, gimana ya mas?

    terima kasih

  • maaf mas izin bertanya,
    saya punya data penjualan. contohnya seperti :
    user | itemid | harga
    x | 001 | 10.000
    x | 001 | 10.000
    x | 001 | 10.000
    x | 002 | 15.000
    y | 001 | 10.000
    y | 002 | 15.000
    y | 003 | 35.000
    y | 003 | 35.000

    menjadi
    user | itemid | jumlahitem | harga
    x | 001 | 3 | 10.000
    x | 002 | 1 | 15.000
    y | 001 | 1 | 10.000
    y | 002 | 1 | 15.000
    y | 003 | 2 | 35.000

  • Terkait fungsi subtotal pada terakhir pembahasan, jika dimasukkan kedalam LARAVEL fungsinya menjadi seperti apa ya? soalnya memakai DB::select(DB::raw tidak berhasil di laravel. Terimakasih

  • pak saya mau nanya jika ingin menampilkan sum totalbayar tahun 2015 dan sum total bayar tahun 2016 bagaimana pak? jadi sum total bayar nya ditampilkan setiap tahunnya

  • pak, saya ingin bertanya bagaimana cara agar nomor urut kembali menjadi 1 setiap groupnya. bagaimana caranya ya pak? apakah bisa?

    dan untuk kolom subtotal dan total apakah bisa colspan, sehingga disamping subtotal tidak ada data lain selain hasil subtotal, jadi hanya ada dua kolom. begitu juga dengan total. terimakasih. saya juga mengirimi anda email pak.

  • pak mau bertanya, saya ingin menjumlahkan beberapa kolom. kalau contoh bapak diatas itu hanya untuk jumlah bayar.

    $subtotal_plg += $row[‘jml_byr’];
    $subtotal_thn += $row[‘jml_byr’];

    bagaimana coding untuk menjumlahkan beberapa kolom ya pak? saya menggunakan php native.

  • Assalamualaikum Pak, maaf saya mau bertanya bagaimana cara menghitung jumlah pada kolom secara otomatis? Saya pakai CI 3 dan php Pak. Terima kasih

  • kalau buat rata-rata per mata pelajaran dari satu kelas gimana ya ?
    jadi saya melakukan 2 foreach
    foreach 1 melooping semua data murid dari kelas yang dipilih
    foreach 2 melooping data nilai dari nis yang ada dilooping 1
    jadi nilai per murid, per mata pelajaran sudah bisa di tampilkan, cuma kendalanya saya kerepotan menampilkan rata-rata per mata pelajaran di tiap-tiap murid.
    mohon penjelasannya kak.

  • maaf mau bertanya bagaimana ya supaya as total bisa masuk pada tabel?
    ini contoh script saya
    db:: table(‘a’)
    ->select (db::raw(‘sum(a.nilai) as total’))
    ….
    ->update([
    ‘total_nilai’ => $request-total

Silakan tinggalkan komentar

Newsletter

Jadilah yang pertama tahu berita terbaru dari Jagowebdev.com