ffCCBot/2.0 (http://commoncrawl.org/faq/)
NEW!! Buku Query MySQL Lihat Detail » x

Menggunakan Fungsi SUM IF Untuk Menjumlahkan Nilai Pada Field (Kolom) Suatu Tabel Pada MySQL

Pada kesempatan kali ini kita akan membahas cara menjumlahkan nilai pada field tertentu dengan kondisi tertentu menggunakan fungsi SUM dan IF.

Fungsi SUM digunakan untuk menjumlahkan nilai pada row yang ada pada suatu kolom, sedangkan fungsi IF digunakan untuk menguji nilai pada row tersebut (berdasarkan satu kondisi tertentu) sehingga diperoleh nilai yang akan digunakan dalam proses penjumlahan.

Persiapan Data

Pada tutorial ini, kita akan menggunakan tiga tabel. Untuk memudahkan, kita akan membuat tiga tabel sederhana yaitu tabel penjualan, pelanggan, dan produk.  Skema tabel dan hubungan (relasi) antar tabel tampak seperti gambar berikut:

Menggunakan Fungsi SUM IF pada MySQL - Diagram ERD

File SQL diatas dapat digunakan untuk membuat semua tabel yang diperlukan beserta contoh datanya.

Pada tutorial ini, kita akan mengolah data pada tabel penjualan, agar lebih mudah dipahami, berikut ini penjelasan field pada tabel penjualan:

  • id_transaksi merupakan nilai unik dari tabel penjualan. Field ini merupakan primary key untuk tabel penjualan.
  • id_pelanggan merupakan merupakan nomor id dari pelanggan. Field ini merupakan foreign key dari field id_pelanggan yang ada pada tabel pelanggan
  • id_produk merupakan nomor id untuk produk. Field ini merupakan foreign key dari field id_produk yang ada pada tabel produk.
  • tgl_byr merupakan tanggal pembayaran dengan format yyyy-mm-dd.
  • jml_byr merupakan jumlah pembayaran.

Adapun isi dari tabel penjualan seperti tampak pada tabel berikut:

+--------------+--------------+-----------+------------+---------+
| id_transaksi | id_pelanggan | id_produk | tgl_byr    | jml_byr |
+--------------+--------------+-----------+------------+---------+
|            1 |            1 | 111       | 2016-02-02 | 1500000 |
|            2 |            1 | 112       | 2016-03-10 | 1250000 |
|            3 |            1 | 113       | 2016-04-10 |  750000 |
|            4 |            2 | 112       | 2015-02-02 |  500000 |
|            5 |            2 | 112       | 2015-03-10 | 3500000 |
|            6 |            2 | 113       | 2016-04-10 | 1500000 |
|            7 |            3 | 115       | 2016-02-02 | 1550000 |
|            8 |            3 | 115       | 2015-03-10 | 2730000 |
|            9 |            3 | 111       | 2016-04-10 | 4949000 |
|           10 |            1 | 115       | 2015-02-02 | 2450000 |
|           11 |            1 | 111       | 2016-03-10 | 1725000 |
|           12 |            4 | 111       | 2015-04-10 |  775000 |
|           13 |            4 | 115       | 2016-04-10 | 2900000 |
+--------------+--------------+-----------+------------+---------+

Sedangkan untuk tabel pelanggan, data yang akan kita gunakan adalah sebagai berikut:

+--------------+---------+-----------+---------+
| id_pelanggan | nama    | alamat    | id_staf |
+--------------+---------+-----------+---------+
|            1 | Alfa    | Jakarta   |       1 |
|            2 | Beta    | Semarang  |       1 |
|            3 | Charlie | Surabaya  |       2 |
|            4 | Delta   | Surakarta |       3 |
+--------------+---------+-----------+---------+

Penggunaan Fungsi SUM IF

Selanjutnya, mari kita gunakan fungsi SUM dan IF untuk melakukan penjumlahan semua penjualan berdasarkan tahun, query yang kita gunakan adalah:

SELECT  SUM(IF( YEAR(tgl_byr) = 2016, jml_byr, 0)) AS jml_2016,
        SUM(IF( YEAR(tgl_byr) = 2015, jml_byr, 0)) AS jml_2015
FROM penjualan

Hasil yang kita peroleh:

+----------+----------+
| jml_2016 | jml_2015 |
+----------+----------+
| 16124000 |  9955000 |
+----------+----------+

Pada query diatas, MySQL akan melakukan pengecekan pada tiap-tiap row satu per satu. MySQL akan menjalankan fungsi YEAR untuk mendapatkan tahun dari data tanggal ada pada kolom tgl_byr, selanjutnya jika:

  • Hasil fungsi YEAR adalah 2016, maka, ambil nilai pada kolom jml_byr untuk disertakan dalam proses penjumlahan, jika tidak, gunakan nilai nol ( 0 ).
  • Proses diatas berlaku juga untuk tahun 2015.
Penting diperhatikan bahwa antara SUM dengan tanda kurung buka tidak boleh ada spasi seperti: SUM ( jika tidak, maka akan muncul pesan error: SQL Error (1630): FUNCTION tutorial_sum_if.SUM does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual

Selanjutnya, jika kita ingin mengetahui jumlah pembelian per pelanggan per tahun, maka kita dapat mengelompokkan data berdasarkan kolom id_pelanggan, query yang kita gunakan:

SELECT  id_pelanggan,
        SUM(IF( YEAR(tgl_byr) = 2016, jml_byr, 0)) AS jml_2016,
        SUM(IF( YEAR(tgl_byr) = 2015, jml_byr, 0)) AS jml_2015,
        SUM(jml_byr) AS TOTAL
FROM penjualan
GROUP BY id_pelanggan

Hasil yang kita dapatkan:

+--------------+----------+----------+---------+
| id_pelanggan | jml_2016 | jml_2015 | TOTAL   |
+--------------+----------+----------+---------+
|            1 |  5225000 |  2450000 | 7675000 |
|            2 |  1500000 |  4000000 | 5500000 |
|            3 |  6499000 |  2730000 | 9229000 |
|            4 |  2900000 |   775000 | 3675000 |
+--------------+----------+----------+---------+

Terakhir, mari kita tampilkan informasi nama pelanggan dengan cara menggabungkan tabel penjualan dan tabel pelanggan. Adapun query yang kita perlukan:

SELECT  id_pelanggan,
	nama,
        SUM(IF( YEAR(tgl_byr) = 2016, jml_byr, 0)) AS jml_2016,
        SUM(IF( YEAR(tgl_byr) = 2015, jml_byr, 0)) AS jml_2015,
        SUM(jml_byr) AS TOTAL
FROM penjualan
LEFT JOIN pelanggan USING(id_pelanggan)
GROUP BY id_pelanggan

Hasil yang kita peroleh:

+--------------+---------+----------+----------+---------+
| id_pelanggan | nama    | jml_2016 | jml_2015 | TOTAL   |
+--------------+---------+----------+----------+---------+
|            1 | Alfa    |  5225000 |  2450000 | 7675000 |
|            2 | Beta    |  1500000 |  4000000 | 5500000 |
|            3 | Charlie |  6499000 |  2730000 | 9229000 |
|            4 | Delta   |  2900000 |   775000 | 3675000 |
+--------------+---------+----------+----------+---------+
Fungsi IF hanya dapat digunakan untuk melakukan pengujian satu kondisi sehingga jika kita ingin menjumlahkan kolom dengan beberapa kondisi, kita tidak bisa menggunakan fungsi IF, melainkan menggunakan CASE.

Jika kita ingin menghitung jumlah baris, misal untuk menghitung jumlah transaksi per pelanggan, kita dapat menggunaan fungsi COUNT. Pembahasan fungsi tersebut dapat diikuti pada tutorial: Menghitung Field (Kolom) Pada Tabel MySQL Dengan Kondisi Tertentu Menggunakan COUNT IF

UPDATE

Mas awy dalam feedbacknya ingin membuat grand total dari total yang ada, saya rasa perlu untuk saya tambahkan pada artikel ini sehingga dapat lebih informatif.

Terdapat beberapa cara untuk membuat grand total dari total yang ada, beberapa diantaranya dibahas pada artikel: Menghitung Total dan Subtotal Pada MySQL.

Pada contoh kali ini kita akan menghitung grand total menggunakan query tersendiri kemudian digabungkan dengan query utama menggunakan UNION ALL, querynya adalah sebagai berikut:

SELECT  id_pelanggan,
	nama,
        SUM(IF(YEAR(tgl_byr) = 2016, jml_byr, 0)) AS jml_2016,
        SUM(IF(YEAR(tgl_byr) = 2015, jml_byr, 0)) AS jml_2015,
        SUM(jml_byr) AS TOTAL
FROM penjualan
LEFT JOIN pelanggan USING(id_pelanggan)
GROUP BY id_pelanggan
UNION ALL
SELECT  "" AS id_pelanggan,
	"Grand Total" as nama,
        SUM(IF(YEAR(tgl_byr) = 2016, jml_byr, 0)) AS jml_2016,
        SUM(IF(YEAR(tgl_byr) = 2015, jml_byr, 0)) AS jml_2015,
        SUM(jml_byr) AS TOTAL
FROM penjualan

Hasil yang kita dapatkan:

+--------------+-------------+----------+----------+----------+
| id_pelanggan | nama        | jml_2016 | jml_2015 | TOTAL    |
+--------------+-------------+----------+----------+----------+
| 1            | Alfa        |  5225000 |  2450000 |  7675000 |
| 2            | Beta        |  1500000 |  4000000 |  5500000 |
| 3            | Charlie     |  6499000 |  2730000 |  9229000 |
| 4            | Delta       |  2900000 |   775000 |  3675000 |
|              | Grand Total | 16124000 |  9955000 | 26079000 |
+--------------+-------------+----------+----------+----------+

Pada query diatas, query pertama dan kedua bentuknya mirip, hanya bedanya, pada query pertama, data kita kelompokkan (GROUP BY) berdasarkan kolom id_pelanggan sedangkan yang kedua, kita tidak melakukan pengelompokan data, MySQL otomatis akan menggabungkan semua data untuk masing masing kolom.

Demikian pembahasan mengenai cara menggunakan fungsi SUM IF untuk menjumlahkan data dengan kriteria tertentu, semoga bermanfaat.

Recomended Post

234 Feedback dari pembaca

      • om agus, sama, saya juga punya maksud seperti itu, bagaimana caranya hasil dari kolom total, ditotal kembali, seperti membuat grand total pada footernya.
        pada case diatas hasil grand totalnya jadi 26.079.000.
        Saya ingin membuat total dari data yang sudah tampil di table html, bukan membuat query dari database.

        thanks,

        • Terimakasih mas, feedback yang bagus.
          Untuk membuat Grand Total sudah saya sertakan pada update artikel diatas.
          Jika ingin menambahkan di HTML, mas bisa menggunakan php.
          Sebenarnya untuk membuat grand total bisa melalui php bisa juga langsung melalui query, tetapi yang paling baik adalah via query karena menganut prinsip “sekali jadi” dan akan kompatibel jika di gunakan di bahasa pemrograman lain.

  • kalaw mau seperti ini gmna :
    kode | nama | jumlah kirim
    001 | buku | 3
    001 | buku | 4
    JUMLAH | 7
    002 | Pensil| 5
    JUMLAH | 5
    003 | hp | 2
    003 | hp | 1
    JUMLAH | 3

    *di setiap nama barang yg sma di jumlah kan dan hasilnya berada tepat di bawah nama barang

    • Coba menggunakan rollup, tapi rollup mengharuskan GROUP BY, jadi harus ada yang unik antar kode dan nama. query:

      SELECT kode, IFNULL(nama, ‘JUMLAH’) AS nama, sum(jumlah) as jumlah FROM `tes` GROUP BY kode, nama WITH ROLLUP

      menghasilkan
      kode|nama|jumlah
      001|buku|3
      001|buku 2|4
      001|JUMLAH|7

      dengan asumsi row ke dua diganti buku 2

  • mas saya maw bertanya
    misalkan dalam tabel ada seperti ini

    Nama barangjumlahtgl
    sampo 3 12-06-2014
    sampo 4 13-06-2014
    sabun 3 13-06-2014

    saya ingin menjumlahkan isi dari tabel bedasarkan nama barang hingga jadi kayak gini

    Nama barangjumlah
    sampo 7
    sabun 3

    tolong pencerahannya ,,

    • Bisa dicoba menggunakan group mas
      Misal struktur tabel seperti ini:

      nama_produk | jml | tgl
      sampo | 3 | 12-06-2014
      sampo | 4 | 13-06-2014
      sabun | 3 | 13-06-2014

      Query:
      SELECT nama_produk AS “Nama Barang”, SUM(jml) AS jumlah
      FROM `produk`
      GROUP by nama_produk

      Hasil:
      Nama Barang | jumlah
      sabun | 3
      sampo | 7

      Sedikit saran, sebisa mungkin hindari penggunaan nama secara langsung, lebih baik diganti dengan id misal sabun 1, sampo 2, dan dibuat tabel referensi misal dengan nama tabel nama_produk, dengan struktur:
      id_produk | nama_produk
      1 | sabun
      2 | sampo

    • Seperti pivot tabel ya mas

      tergantung fieldnya mas, bisa pakai IF atau CASE
      kalau seperti diatas

      SELECT
      	SUM (IF(tgl_byr LIKE "201101%", jml_byr, 0)) AS jml_byr_01,
      	SUM (IF(tgl_byr LIKE "201102%", jml_byr, 0)) AS jml_byr_02,
      	SUM (IF(tgl_byr LIKE "201103%", jml_byr, 0)) AS jml_byr_03,
      	SUM (IF(tgl_byr LIKE "201104%", jml_byr, 0)) AS jml_byr_04,
      	SUM (IF(tgl_byr LIKE "201105%", jml_byr, 0)) AS jml_byr_05
      FROM
      	tunai
      

      Jika parameter lebih dari 1

      SELECT
      	SUM (CASE WHEN tgl_byr LIKE "%01%" AND tahun LIKE "2011%" END) AS jml_byr_01,
      	SUM (CASE WHEN tgl_byr LIKE "%02%" AND tahun LIKE "2011%" END) AS jml_byr_02,
      	SUM (CASE WHEN tgl_byr LIKE "%03%" AND tahun LIKE "2011%" END) AS jml_byr_03,
      	SUM (CASE WHEN tgl_byr LIKE "%04%" AND tahun LIKE "2011%" END) AS jml_byr_04,
      	SUM (CASE WHEN tgl_byr LIKE "%05%" AND tahun LIKE "2011%" END) AS jml_byr_05
      FROM
      	tunai
      

  • Om mau nanya, saya punya tabel :
    ———————————————————-
    | Kode | Header | Nama | Saldo |
    ———————————————————-
    1-10-0 | – | Kas |
    1-11-0 | 1-10-0 | Kas A | 1000
    1-12-0 | 1-10-0 | Kas B | 200
    2-10-0 | – | Kendaraan |
    2-11-0 | 2-10-0 | Mobil |
    2-11-1 | 2-11-0 | avanza | 50
    2-11-2 | 2-11-0 | jazz | 80
    2-12-0 | 2-10-0 | Motor |
    2-12-1 | 2-12-0 | honda | 30
    ———————————————————-

    Bagaimana jika saya update atau insert salah satu kode maka total saldo otomatis ter SUM ke header masing2 kode seperti berikut :
    ———————————————————-
    | Kode | Header | Nama | Saldo |
    ———————————————————-
    1-10-0 | – | Kas | 1200
    1-11-0 | 1-10-0 | Kas A | 1000
    1-12-0 | 1-10-0 | Kas B | 200
    2-10-0 | – | Kendaraan | 160
    2-11-0 | 2-10-0 | Mobil | 130
    2-11-1 | 2-11-0 | avanza | 50
    2-11-2 | 2-11-0 | jazz | 80
    2-12-0 | 2-10-0 | Motor | 30
    2-12-1 | 2-12-0 | honda | 30
    ———————————————————-

    Mohon bantuannya Om 🙂

    • Fungsi terkait untuk menangani permasalahan tersebut biasanya pakai trigger mas, namun sepengetahuan saya, di MySQL kita tidak dapat memanipulasi row pada tabel yang sama, ketika tabel tersebut sedang dimanipulasi baik dengan trigger maupun procedure, contoh ketika kita menginsert atau mengupdate row tertentu, di waktu bersamaan tidak dapat meng insert atau update row yang lain.

      Mungkin cara yang bisa dipakai adalah membuat temporary tabel, nilai saldo disimpan di tabel tersebut, kemudian dipindahkan ke tabel asli, namun hal tersebut akan merepotkan jika data yang dimanipulsai jumlahnya besar.

      Walaupun kita tidak dapat memanipulasi row yang lain, kita dapat memanipulasi nilai yang akan di tambahkan atau di ubah, misal dengan trigger berikut, kita memanipulasi data saldo yang akan ditambahkan menjadi total saldo di header yang sama:

      DELIMITER $$
      CREATE TRIGGER update_total_saldo BEFORE INSERT ON kendaraan
      FOR EACH ROW
      BEGIN
           DECLARE  total INT(11);
           SELECT SUM(saldo) + NEW.saldo INTO total FROM kendaraan WHERE header = NEW.header;
           SET NEW.saldo = total;
      END
      $$
      DELIMITER ;
      

      perintah diatas hanya bisa dilakukan ketika data belum ditambahkan BEFORE UPDATE tidak bisa dilakukan ketika data setelah ditambahkan AFTER UPDATE

      sehingga jika kita lakukan perintah

      INSERT INTO kendaraan VALUES ('1-13-0', '1-10-0' , 'Kas C', 1200);
      

      maka nilai saldo akan menjadi 2400 bukan 1200 lagi.

      Semoga dapat membantu.
      Salam 🙂

    • Mungkin seperti ini mas:

      SELECT id_pelanggan, tgl_byr, jml_byr
      FROM tunai
      GROUP BY id_pelanggan, tgl_byr
      

      hasilnya:

      id_pelanggan	tgl_byr		jml_byr
      012546		20100202	500000
      012546		20100310	3500000
      012546		20110410	1500000
      015558		20100410	775000
      015558		20110410	2900000
      020011		20100202	2450000
      020011		20110202	1500000
      020011		20110310	1250000
      020011		20110410	750000
      027845		20100310	2730000
      027845		20110202	1550000
      027845		20110410	4949000
      

  • Mas..kalo menghitung pembagian antar field dari 2 table berikut:
    Tabel 1:
    ————————————————————
    ID | Perusahaan | penghasilan | Pajak |
    ————————————————————-
    1 | PT. Anugerah | 20.000.000 | |
    2. | CV. Makmur | 20.000.000 | |

    Keterangan:
    – ID (int) (10) (key)
    – Perusahaan (varchar) (50)
    – Penghasilan (varchar) (30)
    – Pajak (Varchar) (30)

    Tabel 2:
    ————————————————————
    ID | Perusahaan | parameter_pajak |
    ————————————————————-
    1 | PT. Anugerah | 200.000 |
    2. | CV. Makmur | 200.000 |

    Keterangan:
    – ID (int) (10) (key)
    – Perusahaan (varchar) (50)
    – Parameter_pajak (varchar) (30)

    Pertanyaanya:
    Misal kita mau menghitung isi kolom “Penghasilan (table-1)” dibagi isi kolom “Parameter_pajak (table-2)” dan hasil baginya otomatis akan terinput ke kolom “Pajak (table-1)”. Serta jika nilai “parameter_pajak (table-2)” dirubah nilai angkanya.. maka total pembagian di “pajak (table-1)” juga akan otomatis berubah. Caranya bagaimana ya mas?? tolong dong mas…makasih sebelumnya.

    • Untuk pertanyaan pertama, coba query ini mas:

      UPDATE tabel_1 SET pajak = penghasilan / (SELECT parameter_pajak FROM tabel_2 WHERE id = 1) WHERE id = 1
      

      yang kedua bisa menggunakan trigger dengan syntax:

      DELIMITER $$
      CREATE TRIGGER update_pajak
          AFTER UPDATE ON tabel_2
          FOR EACH ROW BEGIN
      
          UPDATE tabel_1
          SET pajak = tabel_1.penghasilan / NEW.parameter_pajak
          WHERE tabel_1.id = NEW.id;
      END $$
      DELIMITER;
      

      Jika syntak diatas dijalankan di PHPMyAdmin, mungkin ada pesan error, namun diabaikan saja, biasanya trigger sudah kesimpan. Setelah itu
      bisa dicoba dengan mengupdate tabel 2:

      UPDATE tabel_2 SET parameter_pajak = 300000 WHERE id = 2;
      

      setelah itu coba cek isi tabel_1

      Sedikit saran dari saya mas:
      1. Untuk nulai angka seperti kolom penghasilan, pajak, dan parameter_pajak, gunakan type data INT, atau BIGINT, karena akan memudahkan memanipulasi data
      2. Untuk penaman tabel maupun field tabel gunakan penamaan yang standar, biasanya huruf kecil semua + underscore, agar memudahkan kita ketika menulis kode, saya biasanya menulis syntax MySQL dengan huruf kapital sehingga jelas perbedaan mana syntax, mana tabel/field.

      Semoga membantu
      Salam…

      • Trimakasih mas untuk sarannya, dan field nya udah sya ganti.
        Trus untuk tipsnya juga sudah sya praktekkan sesuai instruksi, dan triggersnya sih udah masuk mas, tapi kok nilainya gak muncul di table ya mas?? di kolom “pajak(table_1)” tetep kosong tuh mas. Trus saat saya masukin script yg kedua, muncul pesan erros “#1054 – Unknown column ‘id = 2’ in ‘where clause’ “.

        Sebagai pertimbangan mas, misalnya table_2 (parameter_pajak) itu saya jadiin satu dengan table_1, jadi saya pake 1 table saja. trus nanti pake sistem pembagian biasa, ama nanti tinggal di select saat nampilin ke browser (kolom “parameter_pajak” ditampilin buat admin, dan kolom “perusahaan & pajak” untuk user). Kira2 dri sisi efektif dan keamanannya lebih bagus dipisah atau disatuin aja mas??

        Mohon pencerahannya mas.., terimakasih banyak sebelumnya.

        • Jawaban 1:
          Untuk tabelnya coba seperti ini mas:

          CREATE TABLE IF NOT EXISTS `tabel_1` (
            `id` int(11) NOT NULL,
            `perusahaan` varchar(50) NOT NULL,
            `penghasilan` int(11) NOT NULL,
            `pajak` int(11) NOT NULL
          ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
          
          INSERT INTO `tabel_1` (`id`, `perusahaan`, `penghasilan`, `pajak`) VALUES
          (1, 'PT. Anugerah', 20000000, 0),
          (2, 'CV. Makmur', 20000000, 0);
          
          CREATE TABLE IF NOT EXISTS `tabel_2` (
            `id` int(11) NOT NULL,
            `perusahaan` varchar(50) NOT NULL,
            `parameter_pajak` int(11) NOT NULL
          ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
          
          INSERT INTO `tabel_2` (`id`, `perusahaan`, `parameter_pajak`) VALUES
          (1, 'PT. Anugerah', 200000),
          (2, 'CV. Makmur', 200000);
          

          Jawaban 2:

          • Untuk field pajak pada tabel_1 tidak perlu di buat karena merupakan attribut komposit (bisa didapatkan dari hasil operasi field lain) dengan penghasilan / parameter pajak, namun situasional juga, kalau sangat terpaksa bisa di tambahkan.
          • Untuk penggabungan tabel, sangat tergantung dari tabel-tabel yang lain, kalau hanya tabelnya itu saja, sebaiknya digabung saja mas, karena tidak ada attribut (kolom) bernilai banyak, jadi fieldnya id, perusahaan, penghasilan, parameter_pajak
          • Jika harus dipisah, sebaiknya entitas perusahaan berdisi sendiri, misal tabel_1 dengan attribute: id_perusahaan, nama_perusahaan sedangkan tabel_2 dengan attribute id_perusahaan, penghasilan, pajak
          • jangan mengulang nama perusahaan, karena akan mempengaruhi integritas data, misal nama perusahaan di tabel_1 diubah, maka tabel_2 sudah tidak sinkron lagi
          • penamaan id sebaiknya spesifik, misal id_perusahaan, bukan sekedar id, karena ketika id_perusahaan menjadi foreign key, akan mudah teridentifikasi, disamping itu ketika memudahkan kita dalam melakukan join ketika menulis kode SQL, hal ini akan terasa jika bekerja dengan banyak tabel, puluhan hingga mungkin ratusan tabel
          • nama tabel sebaiknya mencerminkan isi tabel, saya menggunakan tabel_1 dan tabel_2 hanya untuk mempermudah saja
          • Agar lebih mendalam, bisa membaca buku ini mas, Dasar Perancangan dan Implementasi Database karya Abdul Kadir, atau Pengantar Data Base / Database karya Ir. Fatansyah

          Semoga dapat membantu…
          Salam….

  • Hallo om agus ph,

    Saya mau tanya
    Kalo cara menghitung total part reject berdasarkan tanggal, shift, part

    Tanggal | shift | barang | reject | jml
    2015-08-20 | S1 | abc | rusak | 3
    2015-08-20 | S1 | abc | patah | 5
    2015-08-20 | S1 | abc | ancur | 7
    2015-08-20 | S1 | def | pecah | 2
    2015-08-20 | S2 | abc | rusak | 4
    2015-08-20 | S2 | def | rusak | 1

    Saya mau menampilkan total reject ketika saya memilih pada option combo box:
    tanggal ’20 agustus 2015′ di ‘shift 1’ untuk part ‘abc’

    Maka tanpa harus submit, akan tampil nilai total di dalam textbox (readonly).

    Mohon pencerahannya.
    Sebelum dan sesudahnya terimakasih om 🙂

    • Misal tabel nya bernama produk, query yang digunakan bisa memakai ini mbak:

      SELECT SUM(jml) as JUMLAH
      FROM produk
      WHERE tanggal = '2015-08-20' AND shift = 'S1' AND barang = 'abc'
      

      nanti ketemu hasilnya 15

      untuk memanggil query tersebut ketika combo box di ganti nilainya, bisa menggunakan ajax, javascript. jika pengen lebih mudah bisa pakai library seperti jquery, event nya bisa pakai onChange, ajaxnya bisa menggunakan get

      Semoga dapat membantu

    • Terima kasih mas.
      Misal kita punya tabel nilai_ujian dengan field nama, nilai1 dan nilai2. Maksudnya ingin menjumlahkan field nilai1 dan nilai2 ya mas? kalau yang dimaksud seperti itu bisa dicoba query berikut:

      SELECT nama, nilai1 + nilai2 as jumlah FROM nilai_ujian

  • Mas, minta bantuannya buat tampilan dibawah ini :

    001 KARYA UMUM 49 49
    001 FILSAFAT DAN PSIKOLOGI 928 928
    001 AGAMA 899 899
    001 ILMU-ILMU SOSIAL 186 186

    Kode nya seharusnya berurutan mas seperti : 001, 002, 003, 004

    query yang saya pakai seperti ini mas :

    $Query0 = mysqli_query($conn, “SELECT SUBSTR(eks_klasifikasi, 2, 3) AS KODE, COUNT(buku_id) AS JUMLAH_JUDUL, COUNT(eks_buku) AS JUMLAH_EKS FROM m_buku JOIN m_eksemplar ON m_buku.buku_id = m_eksemplar.eks_buku WHERE eks_klasifikasi LIKE ‘%0’ AND buku_id IS NOT NULL”)

    Fungsi LIKE nya saya ganti untuk nomor urut 002 tapi pas di tampilan tetap 001. Thanks bantuannya Mas

    • Saya belum ada gambaran data awalnya mas, cuman bisa dicoba untuk menambahkan group by, karena ketika kita menggunakan fungsi agregat seperti COUNT, maka dibelakang layar MySQL akan melakukan group, yang field nya otomatis dipilihkan oleh MySQL, sehingga kadang hasil untuk field non agregat tidak sesuai harapan.

  • dear om agus,

    terima kasih atas responnya..
    maksud saya sih saya membuat grand total dariphp karena untuk menguji hasil querynya.
    saya mau buat grand total untuk jurnal umum di akuntansi. jadi saya bisa cek apakah debet dan kreditnya sama. jadi bila ada kesalahan input di detailnya, saya bisa crosscheck.
    btw, sekali lagi, terima kasih atas pencerahannya.. sukses ya om agus..

    salam,

    • Oh begitu ya mas,
      iya bisa pakai PHP mas, memang tidak bisa semua output dapat kita dapatkan langsung dari query MySQL,
      untuk case yang kompleks kadang perlu bantuan PHP.
      Sukses juga ya mas Awy…

  • Mas Agusph
    Jika saya ingin membuat tabel PERHITUNGAN program gaji pegawai sederhana misal :
    seperti perkalian penjumlahan dan lain lain dan program tsb saya SELIPKAN di program PHPMAKER apakah ada bedanya ? mksdnya apakah coding PHP murni dan PHPMAKER berbeda ? terima kasih

    • PHPMaker menyediakan berbagai fungsi untuk fetching data pada database mas, secara default aplikasi tersebut menggunakan active record untuk pengelolaan databasenya, namun kita juga dapat menjalankan perintah SQL murni seperti menggunakan fungsi ew_LoadRecordset

  • om agus saya mau tanya, tapi sebelumnya saya jelaskan dulu ini saya bingung di sistem yang saya buat yaitu sistem koperasi, nah saya bingungnya cara nampilin sisa angsuran yang belum di bayar,contoh:si a meminjam 12 jt dan susah di angsur 1jt per bulan dan sudah bulan ke 6 nah jadinya 12-6 = 6 jt sisa hutang yang harus di angsur saya bingung cara menampilkannya dengan query , mohon bantuannya dan satu lagi untuk menampilkan ansuran ke berapa juga masih bingung trims

    • Saya perlu tahu struktur tabel nya mas, misal:

      tabel nasabah
      id_nasabah | nilai_kredit
      1 | 12000000

      tabel_angsuran
      id_nasabah | jml_byr | tgl_byr
      1 | 1000000 | 2016-01-01
      1 | 1000000 | 2016-02-01
      1 | 1000000 | 2016-03-01
      1 | 1000000 | 2016-04-01
      1 | 1000000 | 2016-05-01
      1 | 1000000 | 2016-06-01

      Bisa dicoba query ini mas

      SELECT id_nasabah, nilai_kredit - jml_angsuran AS saldo
      FROM tabel_nasabah
      LEFT JOIN (
      	SELECT id_nasabah, SUM(jml_byr) as jml_angsuran
      	FROM tabel_angsuran
      	GROUP BY id_nasabah
      ) as tbl_angsuran
      USING (id_nasabah)
      

  • Om agus, mau tanya nih
    Saya punya query spt ini:

    SELECT pembelian.kode_barang, 
    		SUM(pembelian.jumlah) AS beli, 
    		penjualan.kode_barang, 
    		SUM(penjualan.jumlah) AS jual. 
    		(barang.kode_barang) AS kode_barang, 
    		barang.nama_barang
    FROM (
    		SELECT * FROM barang 
    		JOIN pembelian 
    		ON barang.kode_barang = pembelian.kode_barang
    	) as pembelian
    LEFT JOIN penjualan ON barang.kode_barang = penjualan.kode_barang
    GROUP BY barang.kode_barang
    

    Yg sy tanyakn
    Ketika input penjualan.jumlah misalkan 1 tapi yg tampil kok gk sesuai yg di input ya, tampil nya jadi 2
    Klo input 11 jadi 22

    Mohon bantuan nya…
    Terimakasih sebelumnya

  • udah solved mas agus
    terimaksih atas referensi nya
    kira-kira query nya seperti ini:

    SELECT `t`.`kode_barang`, `t`.`nama_barang`, `t`.`satuan`, `t`.`kategori`,
    		SUM(`t`.`belii`) AS `beli`,  SUM(`t`.`juall`) AS `jual` 
    FROM
    (
    	SELECT `barang`.`nama_barang`, `barang`.`satuan`, `barang`.`kategori`,
    		`pembelian`.`kode_barang`, SUM(`pembelian`.`jumlah`) As `belii`, NULL AS `juall`
    	FROM `pembelian` 
    	LEFT JOIN `barang` USING (`kode_barang`) 
    	GROUP BY `barang`.`kode_barang` 
    		UNION 
    	SELECT `barang`.`nama_barang`, `barang`.`satuan`, `barang`.`kategori`,
    		 `penjualan`.`kode_barang`, NULL AS `belii`,SUM(`penjualan`.`jumlah`) AS `juall` 
    	FROM `penjualan` 
    	LEFT JOIN `barang` USING(`kode_barang`)
    	GROUP BY `barang`.`kode_barang`
    ) AS `t`  GROUP BY `kode_barang`
    

    mohon di koreksi jika ada salah 🙂
    maaf telat replay

  • Mas Agusph saya punya tabel akun dan jurnal bagaimana querynya untuk menampilkan Neraca?

    TABEL AKUN
    KODE	NAMA_AKUN	JENIS	                GOLONGAN	    KET	        SALDO_AWAL
    1010001	Kas	        Aktiva	                Aktiva Lancar	       D	10.000.000
    1010002	Persediaan	Aktiva	                Aktiva Lancar	       D	5.000.000
    1020001	Mobil	        Aktiva	                Aktiva Tetap	       D	10.000.000
    1020002	Tanah	        Aktiva	                Aktiva Tetap	       D	20.000.000
    2010001	Utang Bank	Pasiva	                Kewajiban Lancar       K	4.000.000
    2010002	Utang Supplier	Pasiva	                Kewajiban Lancar       K	2.000.000
    3010001	Modal Pemilik	Modal	                Modal	               K	79.000.000
    3020001	Rugi Laba	Modal	                Rugi Laba	       K	14.000.000
    4010001	Pendapatan 1	Pendapatan	        Pendapatan Operasional	K	20.000.000
    4010002	Pendapatan 2	Pendapatan	        Pendapatan Operasional	K	5.000.000
    4020001	Pendapatan Lain	Pendapatan	     Pendapatan Non Operasional	K	2.000.000
    5010001	Biaya Gajih	Biaya	               Biaya Operasional	D	10.000.000
    5010002	Biaya Atk	Biaya	               Biaya Operasional	D	2.000.000
    5020001	Biaya Lainnya	Biaya	           Biaya Non Operasional	D	1.000.000
    
    
    
    TABEL JURNAL
    NO 	TGL	        KODE	GOLONGAN	              KET	NOMINAL
    1	2016/03/01	1010001	Aktiva Lancar	               D	1.000.000
    1	2016/03/01	2010001	Kewajiban Lancar	       K	1.000.000
    2	2016/03/01	3010001	Modal	                       D	2.000.000
    2	2016/03/01	1010001	Aktiva Lancar	               K	2.000.000
    3	2016/03/01	1010001	Aktiva Lancar	               D	5.000.000
    3	2016/03/01	4010001	Pendapatan Operasional	       K	5.000.000
    4	2016/03/01	5010001	Biaya Operasional	       D	2.000.000
    4	2016/03/01	1010001	Aktiva Lancar	               K	2.000.000
    
    
    TABEL NERACA
    Aktiva			
    	Aktiva Lancar		
    1010001	Kas	                       D	12.000.000
    1010002	Persediaan	               D	5.000.000
    	Total Aktiva Lancar		        17.000.000
    			
    	Aktiva Tetap		
    1020001	Mobil	                       D	39.000.000
    1020002	Tanah	                       D	20.000.000
    	Total Aktiva Tetap		        59.000.000
    	Total Aktiva		                76.000.000
    			
    Pasiva			
    	Kewajiban Lancar		
    2010001	Utang Bank	               K	5.000.000
    2010002	Utang Supplier	               K	2.000.000
    	Total Kewajiban Lancar		        7.000.000
    			
    	Modal		
    3010001	Modal Pemilik	               K	52.000.000
    	Total Modal		                52.000.000
    			
    	Rugi Laba		
    3020001	Rugi Laba	               K	17.000.000
    	Total Pasiva		                76.000.000
    

    • Untuk dapat menghubungkan kedua tabel reation nya harus ONE to ONE mas, maka perlu untuk membuat tabel jurnal menjadi 1 row untuk setiap kode akun, coba query berikut mas:

      SELECT kode, nama_akun, ta.ket,
      		CASE 
      			WHEN ta.jenis = "Aktiva"
      			THEN saldo_awal + nominal_d - nominal_k 
      			WHEN ta.jenis = "Pasiva"
      			THEN saldo_awal - nominal_d + nominal_k
      			ELSE 0
      			END 
      		AS Saldo
      FROM tabel_akun ta
      LEFT JOIN	
      	(
      		SELECT kode, jenis, SUM(IF (ket = "D", nominal, 0)) as nominal_d, SUM(IF(ket = "K", nominal, 0)) as nominal_k
      		 FROM(
      			 SELECT kode, jenis, tj.ket, SUM(nominal) as nominal 
      			 FROM tabel_jurnal tj 
      			 LEFT JOIN tabel_akun USING(kode)
      			 WHERE tj.ket = "D" GROUP BY kode
      				UNION ALL
      			 SELECT kode, jenis, tj.ket, SUM(nominal) as nominal 
      			 FROM tabel_jurnal tj
      			 LEFT JOIN tabel_akun USING(kode)
      			 WHERE tj.ket = "K" GROUP BY kode
      		) as temp
      		GROUP BY kode
      	) as jurnal USING(kode)

      Kode diatas memberikan gambaran umum untuk langkah selanjutnya

  • mas mau nanya kalau saya punya seperti ini querynya gimana ya mas
    no anggaran bobot %
    1 300 ?
    2 200 ?
    3 500 ?
    tot sum(anggaran) sum(bobot)
    bobot didapat dari => anggaran/sum(anggaran)*100

    mohon pencerahannya mas

  • data awal seperti ini mas agus

      
    field tabel kegiatan     field tabel anggaran
    id_kegiatan              id_anggaran
    kode_kegiatan            kode_kegiatan
    kegiatan                 anggaran
                             tahun_anggaran 
    
    bagaimana querynya untuk dapat tampilan seperti berikut 
    no    anggaran  bobot
    1     200.000   13,33
    2     400.000   26,67
    3     500.000   33,33
    4     100.000   6,67
    5     300.000   20,00
    Total 1500.000  100,00    
    

    nilai bobot di dapat dari bobot= (anggaran/totalanggaran)*100 atas bantuannya saya ucapkan terima kasih

    • Untuk single query bisa dicoba query ini mbak:

      SELECT id_anggaran, anggaran, ROUND(anggaran/(SELECT SUM(anggaran) FROM anggaran) * 100, 2) as bobot 
      FROM anggaran
      UNION
      SELECT 'TOTAL',  SUM(anggaran), '100%'
      FROM anggaran

      Namun kelemahannya, karena menggunakan subquery pada select, maka jika row yang diolah banyak maka waktu eksekusi semakin lama, arternatifnya bisa menggunakan variabel:

      SET @total = (SELECT SUM(anggaran) FROM anggaran);
      
      SELECT id_anggaran, anggaran, ROUND(anggaran/@total*100, 2) as bobot 
      FROM anggaran
      UNION
      SELECT 'TOTAL',  SUM(anggaran), '100%'
      FROM anggaran

      Hasilnya:

      +-------------+----------+-------+
      | id_anggaran | anggaran | bobot |
      +-------------+----------+-------+
      | 1           |   200000 | 13.33 |
      | 2           |   400000 | 26.67 |
      | 3           |   500000 | 33.33 |
      | 4           |   100000 | 6.67  |
      | 5           |   300000 | 20.00 |
      | TOTAL       |  1500000 | 100%  |
      +-------------+----------+-------+

  • mas Agus, izin bertanya..

    Data saya misal seperti ini :

    TABEL PEMAKAIAN BAHAN

    Tanggal      Bahan      Jumlah Pakai     Gudang
    01/04/2016   Terigu          10          BELAKANG
    02/04/2016   Terigu           5          BELAKANG
    03/04/2016   Terigu           5          depan
    10/04/2016   Terigu           5          BELAKANG
    01/04/2016   Mentega         10          BELAKANG
    02/04/2016   Mentega         10          depan
    04/04/2016   Mentega         10          BELAKANG
    01/04/2016   Telur           10          BELAKANG
    02/04/2016   Telur           10          BELAKANG
    03/04/2016   Telur           10          depan
    
    TABEL SUPPLY BAHAN
    
    Tanggal      Bahan      Jumlah Supply    Gudang
    01/04/2016   Terigu         100          BELAKANG
    01/04/2016   Terigu          50          depan
    04/04/2016   Terigu         100          BELAKANG
    01/04/2016   Telur          100          BELAKANG
    03/04/2016   Telur          100          BELAKANG
    01/04/2016   Mentega        100          BELAKANG
    04/04/2016   Mentega        100          BELAKANG
    

    Hasil yang ingin diharapkan adalah :
    JIKA kita pilih TANGGAL ANTARA : 01/04/2016 sampai dengan 03/04/2016 dan GUDANG : BELAKANG

    data yang ditampilkan adalah :

    Bahan      Jlh Pemakaian   Jumlah Supply
    Terigu         15               100
    Mentega        10               100
    Telur          20               200
    

    mohon share ilmunya mas, terima kasih sebelumnya…

    • Untuk menjoinkan tabel, hubungan antar tabel tersebut HARUS one to one relationship mbak, jika belum maka buat temporary tabel dengan subquery.
      Sedikit saran: Untuk tanggal sebaiknya pakai format standar database: yyyy-mm-dd, untuk nama gudang dan nama bahan bisa digantikan kode

      Dengan asumsi data apa adanya, coba gunakan query ini untuk memperoleh hasil yang diinginkan:

      SELECT bahan, SUM(jml_pakai) AS "Jml Pemakaian", jml_supply AS "Jml Supply"
      FROM pemakaian
      LEFT JOIN
      (
      	SELECT SUM(jml_supply) AS jml_supply, bahan
      	FROM supply
          WHERE STR_TO_DATE(tanggal, '%d/%m/%Y') BETWEEN "2016-04-01" AND "2016-04-03"
          GROUP By bahan
      ) as supply
      USING(bahan)
      WHERE STR_TO_DATE(tanggal, '%d/%m/%Y') BETWEEN "2016-04-01" AND "2016-04-03"
      GROUP BY bahan

  • Hello Pak Agus, mau nanya , misalnya saya punya
    Tabel 1 dengan total row 5 dan
    table 2 dengan total row 10 serta
    table 3 dengan total row 25

    pertanyaan :
    bagaiman supaya tabel 4 ini berisi semua row yang ada di tabel 1 , tabel 2, tabel 3 sehingga jumlah row yang ada di tabel 4 ini menjadi 50 row dan otomatis terus bertambah dan berkurang jika row ditabel 1 , tabel 2 dan tabel 3 ada yang bertambah atau berkurang

    Thanks, salam

    • Coba pakai union mas, misal:
      SELECT id_tabel1, nama_tabel1, alamat_tabel1 FROM tabel1
      UNION SELECT id_tabel2, nama_tabel2, alamat_tabel2 FROM tabel2
      UNION SELECT id_tabel3, nama_tabel3, alamat_tabel3 FROM tabel3

      Syarat menggunakan union: banyaknya kolom HARUS sama, jika tidak sama bisa menggunakan fixed value

  • izin tanya lagi pak Agus1.mau tanya lagi pak agus, apakah dengan cara diatas brarti ada terbentuk data tabel baru ya. ..? bukan hanya view saja kan.?
    2. bagaimana cara membuat tabel misalnya tabel terdiri dari 4 field dengan judul fieldnya yaitu:
    field1 : namabarang
    field2 : jumlahbarang
    field3 : hargapersatuan
    field4 : total
    lanjut pertanyaannya : bagaimana supaya tabel ini di field 4 otomatis terisi datanya karena hasil perkalian dari field2 dan field 3?
    thks salam

    • Itu temporary tabel mas, maksudnya ya adanya pas ketika query saja bukan real tabel.

      Untuk pertanyaan kedua, perkaliannya bisa dilakukan pada sisi aplikasi, hasilnya diinsert ke field total. Namun cara ini memiliki kelemahan yaitu ketika salah satu field diupdate, data filed total menjadi tidak akurat.

      Solusinya perkaliannya dijalankan disisi database, gunakan trigger mas, sehingga ketika salah satu field diupdate, otomatis menjalankan query untuk menghitung total dan mengupdate field total

  • 1. Pak agus,jadi bagaimana supaya bisa otomatis terbentuk data tabel hasil gabungan row semnua? Tdk hanya temporaly tabel, mengingat setiap nanti mau lihat gabungannya harus ketik sql itu lagi kan agak repot? Adakah cara yang otomatis sekali buat saja?
    2. Untuk field yang hasil perkalian otomatis keluar, ,. Boleh tolong di bantu kasih contoh sqlnya yang procedure? Sehingga tabel nya menjadi langsung nampak field 1, field2, field 3 dan field 4 nya otomatis terbentuk.. Maklum pak agus.. baru belajar… salam d

    • 1. Itu memang harusnya demikian mas. Jika menginginkan output seperti itu, memang harus pakai UNION, seberapa kalipun, kecuali desain tabelnya diubah, 3 tabel menjadi satu tabel. Jika menambahkan satu tabel untuk merekap 3 tabel tersebut, saya rasa itu bukan desain tabel yang baik, keuali dalam kondisi ekstra ordinary

      2. Setahu saya desain tabel yang baik salah satunya tidak ada field yang isinya turunan dari field yang lain, termasuk yang field total tadi, karena field tadi dapat dengan mudah didapat dari fieldd-field lainnya. Kecuali kalau memang kondisi ekstra ordinary. Untuk masalah query yang berulang, memang seharusnya seperti itu tinggal di optimize. Untuk trigger, bisa coba dipelajari ini mas: http://www.sitepoint.com/how-to-create-mysql-triggers/

  • simpel mantap, klo menjumlahkan baris satu dnegan baris sebulumnya gmn ya mas?
    misal
    ID JML PARETO
    01 10 10
    02 20 30
    02 10 40
    03 15 55
    01 20 75
    mencari jumlah pareto

  • mau tanya pak agus
    misal ada tabel dengan format
    nim | nama | alamat | nilai | bulan | tahun
    trs saya ingin menampilkan data dengan format
    nim | nama | alamat | nilai bulan sekarang | nilai bulan kemarin
    itu querynya seperti apa ya

    • Coba query ini mas:

      SELECT nim, nama, alamat, 
      		COUNT(IF(bulan = MONTH(NOW()), bulan, NULL)) AS jml_bln_sekarang,
      		COUNT(IF(bulan < MONTH(NOW()), bulan, NULL)) AS jml_bln_kemarin
      FROM `tabel`
      GROUP BY nim
      

      • blm bisa mas
        jadi isi di bulan itu dalam format angka 1-12, trs tahun misal 2016
        jadi itu pencariaan berdasarkan bulan yg ingin di tampilkan saja mas
        jadi misal saya ingin menampilkan data bulan 03 / april, maka saya pilih pencarian berdasarkan bulan april itu,
        trs yang ingin ditampilkan adalah bulan sebelumnya dan nilai bulan sebelumnya mas
        terima kasih

        • Blm bisanya kenapa ya mas?, atau cobe seperti ini:

          SELECT nim, nama, alamat, 
          		COUNT(IF(bulan = 4), bulan, NULL) AS jml_bln_sekarang,
          		COUNT(IF(bulan = 3, bulan, NULL)) AS jml_bln_kemarin
          FROM `tabel`
          WHERE bulan = 4
          GROUP BY nim

          Kalau belum bisa coba ditampilkan contoh datanya mas, biar saya tahu pasti bentuk datanya dan output yang diinginkan

  • pagi maaf saya newbie, mau nanya. cara menggunakan fungsi aritmatika pengurangan pada tabel yang saya buat. misal id = 1, gaji =1000 cashbon=200 sisa= pengen disi hasil pengurangan gaji-cashbon.
    operasinya gmna itu om? terus pengen otomatis ke id selanjutnya. nuwun

    • Langsung saja mas misal:

      SELECT id, gaji, cashbon, gaji - cashbon AS sisa
      FROM table
      

      Kalau belum bisa, bisa disebutkan data awalnya seperti apa mas….

  • mas mau nanya ,saya punya tabel seperti ini
    tabel a
    kode_barang nama minimal
    B12 Gula 12
    B13 Beras 15
    tabel b
    kode_detail kode_barang jumlah
    D01 B12 5
    D02 B13 5
    D03 B12 20

    pertanyaan saya mas, bagaimana menampilakan data dimana data lebih kecil dari minimal. jadi yang keluar nanti hanya beras gitu mas. Terimakasih sebelumnya

    • Coba pakai join kemudian pakai operator pebanding

      SELECT kode_detail, kode_barang, jumlah
      FROM tabel_b
      LEFT JOIN tabel_a USING (kode_barang)
      WHERE jumlah > minimal
      

  • mas sy lagi membuat grand total mirip seperti di atas, tapi bedanya, field saya definisikan varchar,
    awalnya lancar jaya mas, sampe saya masukin code yang grand total dia error di :

    Select ‘Grand Total’ AS alat.lokasi

    code yang saya gunakan ini

    SELECT alat.lokasi,
             SUM(CASE WHEN alat.type = 'laptop' THEN 1 ELSE 0 END) AS laptop,
             SUM(CASE WHEN alat.type = 'printer' THEN 1 ELSE 0 END) AS printer,
             SUM(CASE WHEN alat.type = 'ups' THEN 1 ELSE 0 END) AS ups,
             SUM(CASE WHEN alat.type = 'ht' THEN 1 ELSE 0 END) AS ht,
             COUNT(type) AS jumlah
        FROM alat
    GROUP BY alat.lokasi
    UNION ALL
    SELECT 'Grand Total' AS alat.lokasi,
    		 
             SUM(CASE WHEN alat.type = 'laptop' THEN 1 ELSE 0 END) AS laptop,
             SUM(CASE WHEN alat.type = 'printer' THEN 1 ELSE 0 END) AS printer,
             SUM(CASE WHEN alat.type = 'ups' THEN 1 ELSE 0 END) AS ups,
             SUM(CASE WHEN alat.type = 'ht' THEN 1 ELSE 0 END) AS ht,
             COUNT(type) AS jumlah
         FROM alat
    

    dan ini data saya mas

    id user type    lokasi
    1 anto laptop makassar
    2 budi laptop jkt
    3 budi printer jkt
    4 bagas laptop gowa
    5 ayu ht makassar
    6 fia ht malay
    7 fia laptop malay
    8 bagas ups gowa
    9 sengklek printer jkt
    10 bayu ht malay
    11 zul laptop makassar
    12 rajif ups gowa
    13 anto laptop makassar
    14 budi printer jkt
    

    mohon bantuannya mas

    • Tidak usah pakai AS alat.lokasi mas, langsung SELECT ‘Grand Total’, SUM … karena itu posisinya sebagai row tambahan (UNION ALL), maka kita tidak perlu mendefinisikan nama kolom (menggunakan AS) karena tetep tidak akan dipakai.

      Pada contoh diatas saya menggunakan alias hanya untuk memudahkan saja. Jika tetap ingin menggunakan alias, maka tidak perlu menggunakan dot mas, misal SELECT ‘Grand Total’ AS lokasi. Dot digunakan untuk mendefiniskan nama fiel d suatu tabel, sehingga pada kondisi diatas, MySQL akan menganggapnya field beneran buka alias, jadi error.

  • contoh kode SQL seperti ini :
    SELECT kelas, jk, COUNT(jk) As jml_jk FROM t_siswa Group BY jk, kelas ORDER BY `t_siswa`.`kelas` ASC

    saya coba convert/creat code PHP :

    tapi ga bisa saya jalankan di php. mohon bantuannya gimana contoh php secara lengkap

    trims sebelumnya mas..

  • mau tanya, sy punya tabel dg kolom id, bulan, jumlah (dalam satu tahun). kalau mau ambil data trimester gimana ya? misal jumlah januari-april, jumlah mei-agustus, jumlah september-desember?

  • saya mau tanya mas saya punya tabel dengan kolom kode_part, nama_part, jumlah, harga, total harga, kalau saya mau mengkalikan jumlah dengan harga trus dapat total harga dan di tambah ppn 10% maka akan menghasilkan grand total gi mana ya mohon bimbingannya ?

    • Coba menggunakan query semacam ini mas:

      SELECT kode_part, nama_part, jumlah * harga AS total_harga, 
      jumlah * harga * 10% AS grand_total
      FROM tabel
      

  • mas tolong dong,kok aku buat falidasi malah eror ya,mngkin ini bukan pertanyaan yang pas untuk pembahasan tutorial di atas akan tetapi saya mnta tolong dong pencerahan nya

  • ass..
    om saya sangat bingung dengan penjumlahan ini..
    saya ada tugas dari pembimbing untuk membuat total harga.
    misalnya saya udh beli 2 hp dengan harga masing” 1.500.000 dan 3.000.000..
    pembimbing saya menginginkan agar totalnya menjadi 4.500.000 ketika di minta rekap penjualan..
    itu gmna ya mas…

    tolong beri scripnya ya om..
    danke

  • selamat pagi pak agus, mohon bantuannya juga nih
    jadi saya mau bkin rekap karyawan berdasrkan asal daerah menggunakan 2 tabel yaitu data_karyawan dan data_pekerjaan
    koding nya kurang lebih seperti ini :

    select bagian,
    	(select count(*) from data_karyawan, data_pekerjaan where data_karyawan.id_kar=data_pekerjaan.id_karyawan and kab="Melawi" and data_karyawan.status_gaji="1" and status="p" and bagian=b.bagian) as melawi_b,
       (select count(*) from data_karyawan, data_pekerjaan where data_karyawan.id_kar=data_pekerjaan.id_karyawan and kab="Melawi" and data_karyawan.status_gaji="2" and status="p" and bagian=b.bagian) as melawi_h,
       (select count(*) from data_karyawan, data_pekerjaan where data_karyawan.id_kar=data_pekerjaan.id_karyawan and kab="Sintang" and data_karyawan.status_gaji="1" and status="p" and bagian=b.bagian) as sin_b,
       (select count(*) from data_karyawan, data_pekerjaan where data_karyawan.id_kar=data_pekerjaan.id_karyawan and kab="Sintang" and data_karyawan.status_gaji="2" and status="p" and bagian=b.bagian) as sin_h,
       (select count(*) from data_karyawan, data_pekerjaan where data_karyawan.id_kar=data_pekerjaan.id_karyawan and kab="Katingan" and data_karyawan.status_gaji="1" and status="p" and bagian=b.bagian) as kat_b,
       (select count(*) from data_karyawan, data_pekerjaan where data_karyawan.id_kar=data_pekerjaan.id_karyawan and kab="Katingan" and data_karyawan.status_gaji="2" and status="p" and bagian=b.bagian) as kat_h,
       (select count(*) from data_karyawan, data_pekerjaan where data_karyawan.id_kar=data_pekerjaan.id_karyawan and kab="Seruyan" and data_karyawan.status_gaji="1" and status="p" and bagian=b.bagian) as seru_b,
       (select count(*) from data_karyawan, data_pekerjaan where data_karyawan.id_kar=data_pekerjaan.id_karyawan and kab="Seruyan" and data_karyawan.status_gaji="2" and status="p" and bagian=b.bagian) as seru_h,
      	(select count(*) from data_karyawan, data_pekerjaan where data_karyawan.id_kar=data_pekerjaan.id_karyawan and prov like "kal%" and kab"Melawi" and kab"Sintang" and kab"Katingan" and kab"Seruyan" and data_karyawan.status_gaji="1" and status="p" and bagian=b.bagian) as kal_b,
        (select count(*) from data_karyawan, data_pekerjaan where data_karyawan.id_kar=data_pekerjaan.id_karyawan and prov like "kal%" and kab"Melawi" and kab"Sintang" and kab"Katingan" and kab"Seruyan" and data_karyawan.status_gaji="2" and status="p" and bagian=b.bagian) as kal_h,
        (select count(*) from data_karyawan, data_pekerjaan where data_karyawan.id_kar=data_pekerjaan.id_karyawan and prov not like "kal%" and data_karyawan.status_gaji="1" and status="p" and bagian=b.bagian) as lain_b,
        (select count(*) from data_karyawan, data_pekerjaan where data_karyawan.id_kar=data_pekerjaan.id_karyawan and prov not like "kal%" and data_karyawan.status_gaji="2" and status="p" and bagian=b.bagian) as lain_h,
        melawi_b+melawi_h as jml
        
    from data_karyawan, data_pekerjaan b
    where data_karyawan.id_kar =b.id_karyawan
    group by b.bagian
    

    datanya berhasil tampil dan sesuai harapan namun terkendala untuk menghitung total karyawan perbaris dan perkolom (grand total) serta persentase di bawah grand totalnya pak

    sudah mencoba codingan diatas namun belum sesuai harapan, kira nya bisa d koreksi dan dibantu pak agus

      • oh iya pak, maaf yah membuat bingung. tabel nya kan ada 2 nih pak, tabel data_karyawan dan tabel data_pekerjaan
        data_karyawan :

        id_kar | nama    | status_gaji | kab       | Prov
        1      | andi    | 1           | Pontianak | Kalbar
        2      | bayu    | 2           | Melawi    | Kalbar
        3      | chandra | 1           | Melawi    | Kalbar
        < ?pre>
        ket : status_gaji 1 = bulanan, 2 = harian
        
        data_pekerjaan
        
        id_kar| bagian         | status
        1     | Adm & umum | p
        2     | Bengkel        | p
        3     | Bengkel        | p
        

        ket. status p = penempatan, soalnya data mutasi ane kasih status=m

        hasil yg d inginkan

        bagian           | hr_dari_melawi | Bln_dari_melawi | hr_dari_kalimantan | bln_dari_kalimantan |hr_pendatang | bln_pendatang | jumlah
        Adm & umum       | 0              | 0               | 0                  | 1                   | 0           | 0             | 1
        Bengkel          | 1              | 1               | 0                  | 0                   | 0           | 0             | 2
        Grandtotal       | 1              | 1               | 0                  | 1                   | 0           | 0             | 3
        persentase       | 33.33          | 33.33           | 33.33              | 0                   | 0           |100.00         |
        % karyawan lokal | ---------------------------------| 100%
        % karyawan pendatang | -------------------------    | 0
        

        ket. hr = harian, bln = bulanan, hr_kalimantan dan bln_kalimantan itu adalah jumlah karyawan yang berasal dari luar melawi gan, walaupun prov nya melawi itu kalbar tetap gak d hitung, yang dihitung yg selain dari melawi, sedangkan pendatang itu yang diluar kalimantan, entah itu dari jawa, papua, sumatera itu dihitung sebagai pendatang.
        yg saya belum bs itu menghitung jumlah, grandtotal, persentase, % karyawan lokal , % karyawan pendatang

        mohon bantuannya pak agus

        • Hindari penggunaan subquery mas, karena akan mempengaruhi performa, coba gunakan CASE.
          Query ini ada tiga bagian
          1. Bagian pertama menghitung per bagian
          2. Bagian kedua menghitung jumlah
          3. Bagian ketiga menghitung persentase
          Ketiganya dipisah UNION ALL
          Coba dipelajari mas…

          SELECT bagian,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 1 AND kab = "Melawi"
          			THEN id_kar
          		END
          	) AS hr_melawi,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 2 AND kab = "Melawi"
          			THEN id_kar
          		END
          	) AS bl_melawi,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 1 AND kab = "Pontianak"
          			THEN id_kar
          		END
          	) AS hr_pontianak,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 2 AND kab = "Pontianak"
          			THEN id_kar
          		END
          	) AS bl_pontianak,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 1 AND prov != "Kalbar"
          			THEN id_kar
          		END
          	) AS hr_lain,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 2 AND prov != "Kalbar"
          			THEN id_kar
          		END
          	) AS bl_lain,
          	COUNT(id_kar)  AS total
          FROM data_karyawan
          LEFT JOIN data_pekerjaan USING(id_kar)
          GROUP BY data_pekerjaan.bagian
          
          	UNION ALL
          
          SELECT "Jumlah" AS bagian,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 1 AND kab = "Melawi"
          			THEN id_kar
          		END
          	) AS hr_melawi,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 2 AND kab = "Melawi"
          			THEN id_kar
          		END
          	) AS bl_melawi,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 1 AND kab = "Pontianak"
          			THEN id_kar
          		END
          	) AS hr_pontianak,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 2 AND kab = "Pontianak"
          			THEN id_kar
          		END
          	) AS bl_pontianak,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 1 AND prov != "Kalbar"
          			THEN id_kar
          		END
          	) AS hr_lain,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 2 AND prov != "Kalbar"
          			THEN id_kar
          		END
          	) AS bl_lain,
          	COUNT(id_kar)  AS total
          FROM data_karyawan
          LEFT JOIN data_pekerjaan USING(id_kar)
          
          	UNION ALL
          
          SELECT "Persentase" AS bagian,
          	ROUND (
          	
          		COUNT(
          			CASE 
          				WHEN status = "p" AND status_gaji = 1 AND kab = "Melawi"
          				THEN id_kar
          			END
          		) / COUNT(id_kar),
          		2
          	) AS hr_melawi,
          	ROUND (
          		COUNT(
          			CASE 
          				WHEN status = "p" AND status_gaji = 2 AND kab = "Melawi"
          				THEN id_kar
          			END
          		)  / COUNT(id_kar),
          		2
          	) AS bl_melawi,
          	ROUND (
          		COUNT(
          			CASE 
          				WHEN status = "p" AND status_gaji = 1 AND kab = "Pontianak"
          				THEN id_kar
          			END
          		) / COUNT(id_kar),
          		2
          	) AS hr_pontianak,
          	ROUND (
          		COUNT(
          			CASE 
          				WHEN status = "p" AND status_gaji = 2 AND kab = "Pontianak"
          				THEN id_kar
          			END
          		) / COUNT(id_kar),
          		2
          	) AS bl_pontianak,
          	ROUND (
          		COUNT(
          			CASE 
          				WHEN status = "p" AND status_gaji = 1 AND prov != "Kalbar"
          				THEN id_kar
          			END
          		) / COUNT(id_kar),
          		2
          	) AS hr_lain,
          	ROUND (
          		COUNT(
          			CASE 
          				WHEN status = "p" AND status_gaji = 2 AND prov != "Kalbar"
          				THEN id_kar
          			END
          		) / COUNT(id_kar),
          		2
          	) AS bl_lain,
          	"100%"  AS total
          FROM data_karyawan
          LEFT JOIN data_pekerjaan USING(id_kar)

          Atau bisa dibuat dua bagian menggunakan WITH ROLLUP

          SELECT IFNULL(bagian, "Jumlah") AS bagian,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 1 AND kab = "Melawi"
          			THEN id_kar
          		END
          	) AS hr_melawi,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 2 AND kab = "Melawi"
          			THEN id_kar
          		END
          	) AS bl_melawi,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 1 AND kab = "Pontianak"
          			THEN id_kar
          		END
          	) AS hr_pontianak,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 2 AND kab = "Pontianak"
          			THEN id_kar
          		END
          	) AS bl_pontianak,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 1 AND prov != "Kalbar"
          			THEN id_kar
          		END
          	) AS hr_lain,
          	COUNT(
          		CASE 
          			WHEN status = "p" AND status_gaji = 2 AND prov != "Kalbar"
          			THEN id_kar
          		END
          	) AS bl_lain,
          	COUNT(id_kar)  AS total
          FROM data_karyawan
          LEFT JOIN data_pekerjaan USING(id_kar)
          GROUP BY data_pekerjaan.bagian
          WITH ROLLUP
          
          	UNION ALL
          
          SELECT "Persentase" AS bagian,
          	ROUND (
          	
          		COUNT(
          			CASE 
          				WHEN status = "p" AND status_gaji = 1 AND kab = "Melawi"
          				THEN id_kar
          			END
          		) / COUNT(id_kar),
          		2
          	) AS hr_melawi,
          	ROUND (
          		COUNT(
          			CASE 
          				WHEN status = "p" AND status_gaji = 2 AND kab = "Melawi"
          				THEN id_kar
          			END
          		)  / COUNT(id_kar),
          		2
          	) AS bl_melawi,
          	ROUND (
          		COUNT(
          			CASE 
          				WHEN status = "p" AND status_gaji = 1 AND kab = "Pontianak"
          				THEN id_kar
          			END
          		) / COUNT(id_kar),
          		2
          	) AS hr_pontianak,
          	ROUND (
          		COUNT(
          			CASE 
          				WHEN status = "p" AND status_gaji = 2 AND kab = "Pontianak"
          				THEN id_kar
          			END
          		) / COUNT(id_kar),
          		2
          	) AS bl_pontianak,
          	ROUND (
          		COUNT(
          			CASE 
          				WHEN status = "p" AND status_gaji = 1 AND prov != "Kalbar"
          				THEN id_kar
          			END
          		) / COUNT(id_kar),
          		2
          	) AS hr_lain,
          	ROUND (
          		COUNT(
          			CASE 
          				WHEN status = "p" AND status_gaji = 2 AND prov != "Kalbar"
          				THEN id_kar
          			END
          		) / COUNT(id_kar),
          		2
          	) AS bl_lain,
          	"100%"  AS total
          FROM data_karyawan
          LEFT JOIN data_pekerjaan USING(id_kar)

          Hasil keduanya sama:

          +------------+-----------+-----------+--------------+--------------+---------+---------+-------+
          | bagian     | hr_melawi | bl_melawi | hr_pontianak | bl_pontianak | hr_lain | bl_lain | total |
          +------------+-----------+-----------+--------------+--------------+---------+---------+-------+
          | Adm&umum   |      1.00 |      0.00 |         1.00 |         0.00 |    1.00 |    0.00 |     3 |
          | Admin      |      0.00 |      0.00 |         0.00 |         0.00 |    1.00 |    1.00 |     2 |
          | Bengkel    |      2.00 |      1.00 |         0.00 |         0.00 |    0.00 |    0.00 |     3 |
          | Jumlah     |      3.00 |      1.00 |         1.00 |         NULL |    2.00 |    1.00 |     8 |
          | Persentase |      0.38 |      0.13 |         0.13 |         NULL |    0.25 |    0.13 |  100% |
          +------------+-----------+-----------+--------------+--------------+---------+---------+-------+

          Pada tabel diatas, terdapat desimal dua digit pada hasil penghitungan. Hal ini karena kita menggunakan UNION, MySQL akan menyesuaikan tipe datanya, untuk mengatasinya bisa gunakan CONCAT pada persentase

          • maaf baru balas lagi mas agus, kemarin kayaknya udah balas tp kelihatannya tidak masuk nih
            jd koding d atas udah d coba mas agus, berhasil tp untuk hasil d kolom total itu masih salah, hasilnya kisaran 31 – 35, lalu total-jumlah itu 3131, total-persentase itu 31303025. padahal data di tabel karyawan cm 9 data, tabel pekerjaan itu 11 data aja.

            apakah structure database saya ada yang salah yah ? di tabel data_karyawan ada
            id_kar, int(5), auto_inc
            status_gaji, varchar(1)
            kab, varchar(30)
            prov, varchar(30)

            sedangkan data_pekerjaan
            id_kerja,int(10), auto_inc
            id_kar,int(5)
            status, varchar(1)
            bagian, varchar(15)

            u/ yang status gaji sudah saya ganti menjadi int(1) tp hasilnya tetap sama, kira nya apa yang perlu d perbaiki yah mas ?

          • Saya belum paham mas maksudnya, tapi kalau lihat struktur tabelnya tidak ada masalah. Saya pakainya varchar semua tidak masalah, mysql akan otomatis melakuakan type casting jika diperlukan

            Pada jawaban saya kemarin saya tambah beberapa data agar hasilnya lebih real. Bisa minta tlg data full tabel nya seperti apa mas? Sama contoh outputnya, kalau kepanjangan bisa dikirim via email

  • mas saya mau tanya untuk menjumlahkan sub total itu bagaimana, seperti nilai 1, nilai 2 pada tabel terus kita jumlahkan seperti
    SELECT nilai1 + nilai2 as jumlah from nilai
    lah masalahnya untuk menjumlahkan nilai keseluruan nilai pada as jumlah itu bagaiman?
    tolong solusinya master please

  • Selamat malam mas Agus saya mau tanya..sebelumnya terima kasih banyak telah merespon
    NIS | Nama | Tanggal 1 |Tanggal2 | Tanggal3 | Tanggal4 | Tanggal5 | Jumlah Huruf H
    011|Rudi | H | H | H | I | S | ??
    002 | Anto | S | A | S | H | H | ??

    Bagaimana query untuk mendapatkan nilai pada kolom Jumlah Huruf H tersebut , terima kasih mas Agus, sehat dan jaya selalu..

    • Sama sama mas,

      Intinya jika ingin melakukan operasi antar kolom, gunakan operator aritmatika seperti + atau -, sedangkan operasi antar baris, gunakan fungsi agregat seperti SUM() atau COUNT() sehingga pada contoh diatas kita gunakan operator +

      SELECT tanggal1, tanggal2, dst.., tanggal1 + tanggal2 + dst… AS jumlah_huruf_H

  • mas minta pencerahannya,
    saya ingin menampilkan data dalam 1 bulan. dari kolom tanggal. dan kolom quantity
    1. dalam 1 hari(pertanggal) bnyak nilai input (contoh 3-4x input) jadi dalam 1 hari ada bnyak data.

    saya ingin menampilkan data 1 bulan, tapi yang dimunculin pertanggal. dan klo ada tanggal sama quantity nya di sum automatis.
    jadi hasilnya misal kaya gini.
    Tabel transaksi
    id_ tgltransaksi quantity
    1 2016-12-01 200
    2 2016-12-02 300
    3. 2016-12-03 400

    karena hasil query 2 kolom ini mau saya tampilkan ke highchart.

    Mohon bantuannya mas.. Terimakasih banyak.
    azmiftah85@yahoo.co.id

      • Yth Mas Agus,
        Udah aku jalankan diatas tapi error, (You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘SUM(reg) as reg)

        Tapi gini deh mas biar jelas.
        ============================= TABEL
        idprod | tanggal_trk | qtyreg |Qtyproc |iduser
        ————————————————————————————
        1 2016-12-01 02:11:10 15106 859 1 1
        2 2016-12-03 05:09:19 15518 400 2 1
        3 2016-12-05 03:17:13 1176 600 3 1
        4 2016-12-06 00:00:00 10834 504 1
        5 2016-11-01 02:10:10 16243 201 5 2
        6 2016-11-03 10:07:00 17424 20 6 1
        7 2016-11-05 10:00:00 17432 7607 3
        8 2016-11-07 10:00:00 19271 134 8 1

        jadi datanya kan banyak, sya mau tampilkan data range date per 1 bulan dalam tahun xx.
        saya butuh nilai QTYREG dan QTYPROC.
        pada saat saya ambil 1 bulan, data di QTYREG & QTYPROC dengan tanggal yg sama langsung ditotal aja. jadi yang muncul hanya tgl 1-31.
        Klo dalam 1 tanggal ada 4 inputan maka langsung ditotal sum.

        Mohon bantuannya mas, terimakasih sebelumnya..
        ajmiftah85@gmail.com

        • Itu jumlah kolom di header beda sama jumlah kolom diisinya mas. Asusmsi seperti ini ya mas:

          +---------+---------------------+--------+---------+---------+
          | id_prod | tgl_trx             | qtyreg | qtyproc | id_user |
          +---------+---------------------+--------+---------+---------+
          |       1 | 2016-12-01 02:11:10 |  15106 |     859 |       1 |
          |       2 | 2016-12-03 05:09:19 |  15518 |     400 |       2 |
          |       3 | 2016-12-05 03:17:13 |   1176 |     600 |       3 |
          |       4 | 2016-12-06 00:00:00 |  10834 |     504 |       1 |
          |       5 | 2016-11-01 02:10:10 |  16243 |     201 |       5 |
          |       6 | 2016-11-03 10:07:00 |  17424 |      20 |       6 |
          |       7 | 2016-11-05 10:00:00 |  17432 |    7607 |       3 |
          |       8 | 2016-11-07 10:00:00 |  19271 |     134 |       8 |
          |       9 | 2016-12-03 10:11:19 |  10234 |     500 |       1 |
          +---------+---------------------+--------+---------+---------+

          Catatan: saya tambahkan 1 baris di paling bawah untuk tes hasil query.

          Intinya untuk melakukan penjummlahan antar baris, gunakan fungsi agregasi SUM(). Coba pakai query ini mas:

          SELECT tgl_trx, SUM(qtyreg), SUM(qtyproc) 
          FROM tb_test 
          WHERE MONTH(tgl_trx) = 12
          GROUP BY DATE(tgl_trx);

          Hasil:

          +---------------------+-------------+--------------+
          | tgl_trx             | SUM(qtyreg) | SUM(qtyproc) |
          +---------------------+-------------+--------------+
          | 2016-12-01 02:11:10 |       15106 |          859 |
          | 2016-12-03 05:09:19 |       25752 |          900 |
          | 2016-12-05 03:17:13 |        1176 |          600 |
          | 2016-12-06 00:00:00 |       10834 |          504 |
          +---------------------+-------------+--------------+
          

          Pada contoh diatas, data qtyreg dan qtyproc di total seperti pada tanggal 03.

          • mantaps dan luar biasa mas APH, hasilnya sudah sesuai harapan.
            Btw klo ada (AS) fungsinya apa, dan yang dibelakang as itu fungsinya jg gmn ya mas?

            Ilmu yang bermanfaat, semga berkah mas n sehat terus..
            Ditunggu updatean upload materinya..

            Terimakasih,

          • Amin, sama sama mas…

            AS digunakan sebagai alias mas yang akan ditampilkan sebagai header tabel hasil query. Misal:
            SELECT tgl_trx, SUM(qtyreg) , SUM(qtyproc), Hasil:

            +---------------------+-------------+--------------+
            | tgl_trx             | SUM(qtyreg) | SUM(qtyproc) |
            +---------------------+-------------+--------------+
            | 2016-12-06 00:00:00 |       10834 |          504 |
            +---------------------+-------------+--------------+
            

            SELECT tgl_trx, SUM(qtyreg) AS jml_1 , SUM(qtyproc) AS jml_2, Hasil:

            +---------------------+---------+----------+
            | tgl_trx             | jumlah_1| jumlah_2 |
            +---------------------+---------+----------+
            | 2016-12-06 00:00:00 |   10834 |      504 |
            +---------------------+---------+----------+

            Hal ini berguna utuk memudahkan pengolahan data, misal daripada meulis $row[‘SUM(qtyreg)’] lebih mudah $row[‘qtyreg’], selain itu juga bermanfaat jika kita melakukan query antar tabel yang memiliki field yang sama, karena ketika kita oleh dalam bentuk array, nama field yang sama akan bergabung menjadi satu.

          • Dear Mas Agus,

            Untuk bisa dan berhasil saya praktekkan di PHP.
            cuma saya ada kendala, mhon pencerahannya mas.

            Ketika saya padukan untuk ditampilkan ke highchart Grafik, itu kendala tanggalnya jadi ga beraturan. ada yang bolong. secara
            jadi minta pencerahannya, antara SUM data diatas + convert datetime to javascript.

            saya menggunakan begini mhon koreksi.

            ( $menu=array();
            $menu2=array();
            $result = $conn->query(“SELECT tgl_trx, SUM(qtyreg) as qtyreg FROM tabel_s WHERE MONTH(tgl_trx)=’12’ AND YEAR(tgl_trx)=’2016′ GROUP BY DATE(tgl_trx) order by tgl_trx”);
            while ($row = $result->fetch_assoc()) {
            $date = strtotime($row[‘tgl_trx’]);
            $date = $date *= 1000 ;

            $menu[] = $date;
            $menu2[] = $row[‘qtyreg’];
            }
            $aray=join(” ,”,$menu);
            $aray2=join(” ,”,$menu2);

            )
            Plus klo hasil QTYreg bisa pembulatan.

            Mohon bantuannya mas agus,
            Terimakasih bnyak.

          • Coba di view source mas, apakah javascriptnya sudah bener.
            Pastikan bentuk data di javascript sudah array atau object.

            Untuk yang array, coba diganti:
            $aray= ‘[‘ . join(‘,’,$menu) . ‘]’;
            $aray2= ‘[‘ . join(‘,’,$menu2) . ‘]’;

            Itu datenya dikali 1000 kenapa mas?

            Untuk pembulatan bisa menggunakan fungsi ROUND di SQL mas, misal:
            SELECT tgl_trx, ROUND(SUM(qtyreg)) as qtyreg

          • Dear Pak APH,

            Terimakaish pak sudah berhasil.
            CUma saya mau digabungkan antara sum dan AVG, nilai dari QTYREG mau diambil avg min dan max nya.,

            Jadi dari tabel diatas itu mau hasilnya.
            1. dikeluarin berdasarkan tanggal dan di QTYReg di sum (sudah ok)
            2. dari data QTYreg ini mau saya ambil avg min dan Max nya.

            Saya menggunakan mysqli_prepare.

            ($stmt = mysqli_prepare($con, "SELECT date_format(tanggal, '%d') as pTgl, sum(reg) as pReg, sum(reproc) as pReproc FROM dprod_datetime where MONTH(tanggal)='$bulan' AND year(tanggal)='$tahun' GROUP BY pTgl order by tanggal asc");
            	$result = array('day' => array(), 'amount' => array(),'reproc' => array());
            	if ($stmt) {
            		mysqli_stmt_execute($stmt);
            		mysqli_stmt_bind_result($stmt, $day, $amount, $reproc);
            	    while (mysqli_stmt_fetch($stmt)) {
            	        $result['day'][] = $day;
            	        $result['amount'][] = (int)$amount;
            			$result['reproc'][] = (int)$amount;
            	    }
            	    mysqli_stmt_close($stmt);
                }
             
            ?> )

            Mohon pencerahannnya mas aGus,
            Terimakasih.

          • Dear Mas Agus,

            Sudah jalan untuk sum dan Grafiknya.

            Yang kmrin dari mas agus ini :

            mysqli_prepare($con, "
            			SELECT date_format(tanggal, '%d') as pTgl, 
            				sum(reg) as pReg, 
            				sum(reproc) as pReproc 
            			FROM dprod_datetime where MONTH(tanggal)='$bulan' AND year(tanggal)='$tahun' 
            			GROUP BY pTgl 
            			order by tanggal asc"
            		);
            

            sudah bisa, cuma saya dari query diatas ingin mengambil Hasil angka yang Minimal dan angka Maksimal dari [sum(reg)] as pReg.

            Nah gabungkan antara sum dan agregation min dan max, mhon pencerahannya mas.
            Karena akan ditampilkan berbeda antara pReg SUm dan nilai maksimah dari pReg.

            Maaf nih bolak balik tanya..hehehe
            matur suwun.

          • Untuk mencari min dan max dari pReg bisa dengan dua cara mas, bisa dengan PHP, bisa dengan SQL. Dengan PHP, loop hasil query diatas, buat array berisi data pReg, kemudian cari value minimal dan maksimal dari array tersebut

            Cara kedua, bisa menggunnakan subquery:

            SELECT MIN(pReg) as min_pReg, MAX(pReg) AS max_pReg
            FROM (
            	SELECT date_format(tanggal, '%d') as pTgl, 
            		SUM(reg) as pReg, 
            		SUM(reproc) as pReproc 
            		FROM dprod_datetime 
                	WHERE MONTH(tanggal)=12 AND year(tanggal)=2016
            	GROUP BY pTgl 
            	ORDER BY tanggal ASC
                ) AS tb_temp

            Hasil:

            +----------+----------+
            | min_pReg | max_pReg |
            +----------+----------+
            |     1176 |    25752 |
            +----------+----------+

        • Dear Mas agus,

          Untuk menampilkan di PHP dengan alias ini saya masih awam mas,
          mohon diberikan contohnya. klo via sql sudah bisa.

          sya coba2 hasilnya jadi tidak jalan.

          Ini query saya ( $result = mysql_query("SELECT MIN(pReg) as min_pReg, MAX(pReg) AS max_pReg FROM ( SELECT date_format(tanggal, '%d') as pTgl, SUM(reg) as pReg, 
          		SUM(reproc) as pReproc 
          	FROM dprod_datetime 
              WHERE MONTH(tanggal)=12 AND year(tanggal)=2016
          	GROUP BY pTgl 
          	ORDER BY tanggal ASC
              ) AS tb_temp "); 
          	
          
          $bln = array();
          $bln['name'] = 'pTgl';
          $rows['name'] = 'pReg';
          $rows2['name'] = 'pReproc';
          
          while ($r = mysql_fetch_array($result)) {
              $bln['data'][] = $r['pTgl'];
              $rows['data'][] = $r['pReg'];
          	$rows2['data'][] = $r['pReproc'];
          
          }
          )
          

          setelah ditambahkan fungsi max n min ini jadi tidak keluar hasilnya.

          mhn maaf mas agus merepotkan, masih belajar.hehe

          Terimakasih banyak.

          • Coba ini mas:

            DARI QUERY:

            // DARI QUERY
            $conn = mysqli_connect('localhost', 'root', '', 'test');
            $result =  mysqli_query($conn, "SELECT MIN(pReg) as min_pReg, MAX(pReg) AS max_pReg 
            				FROM ( 
            					SELECT date_format(tanggal, '%d') as pTgl, 
            						SUM(reg) as pReg, 
            						SUM(reproc) as pReproc 
            					FROM dprod_datetime 
            					WHERE MONTH(tanggal)=12 AND year(tanggal)=2016
            					GROUP BY pTgl 
            					ORDER BY tanggal ASC
            				) AS tb_temp "
            			);
            
            $hasil = mysqli_fetch_assoc($result);
            $min = $hasil['min_pReg'];
            $max = $hasil['max_pReg'];
            print_r($hasil);

            DARI PHP ARRAY

            // DARI PHP
            $result =  mysqli_query($conn, "SELECT date_format(tanggal, '%d') as pTgl, 
            					SUM(reg) as pReg, 
            					SUM(reproc) as pReproc 
            				FROM dprod_datetime 
            				WHERE MONTH(tanggal)=12 AND year(tanggal)=2016
            				GROUP BY pTgl 
            				ORDER BY tanggal ASC"
            			);
            
            while ($r = mysqli_fetch_array($result)) {
                $preg[] = $r['pReg'];
            }
            $min = MIN($preg);
            $max = MAX($preg);
            print_r($preg);

            Hindari penggunaan mysql_query, gunakan mysqli_query, karena di php versi terbaru mysql_query sudah dihapus

          • Mas Agus,

            Terimakasih sudah bisa, berfungsi dengan baik dan bisa integrasi dengan grafik.
            cuma maaf ada 1 lagi nih,

            dari mas agus diatas, untuk menampilkan Max & Min sudah ok.
            CUma klo misal saya ingin mengambil tanggal dan nilai max . saya coba tambahkan select tanggal ga berhasil.
            Jadi klo yang nilai maksimun tanggal 5 Desember 2016. saya mau ambil tanggal nya & nilai maks nya.

            ------------------
            Tabel :
            ID	|tanggal                |reg_qty	  |rep_qty
            37	|2016/11/30 21:11	|2323	          |1221
            30	|2016/12/01 0:00	|6554	          |45454
            2	|2016/12/02 22:09	|15518	          |400
            3	|2016/12/04 20:17	|1176	          |600
            38	|2016/12/04 22:00	|1222	          |342
            39	|2016/12/05 5:29	|456	          |5677
            4	|2016/12/05 17:00	|10834	          |50
            ------------------------
            

            Terimakasih atas bantuan dan ilmunya mas agus.

          • Sama sama mas…
            Coba pakai query ini:

            SELECT tanggal, reg 
            FROM `dprod_datetime` 
            WHERE reg = (SELECT MIN(reg) 
            		FROM dprod_datetime
            		)

            Hasil:

            +---------------------+------+
            | tanggal             | reg  |
            +---------------------+------+
            | 2016-12-05 03:17:13 | 1176 |
            +---------------------+------+

          • Mas,
            Klo ada where Bulan dan Tahun dimana menambahkannya. sya coba2 cuma bisa keluar tahun aja.
            Jadi saya mau filter bulan 12 tahun 2015.
            Jadi QTYKG diambil max + di sum by tanggal, jadi diambil nilai max dalam sebulan dari tgl tsb.
            jadi hasilnya tanggal sekian, nilai max/min sekian.

            Terimakasih bnyak mas,

          • Scriptnya seperti apa mas? apa maksudnya seperti ini:

            SELECT tanggal, reg 
            FROM `dprod_datetime` 
            WHERE reg = (  SELECT MIN(reg) 
            		FROM dprod_datetime
                    	WHERE MONTH(tanggal) = 12 AND YEAR(tanggal) = 2016
            	    )

            Atau nilai min per bulan?

            SELECT MONTH(tanggal) AS bulan, tanggal, reg 
            FROM `dprod_datetime` 
            WHERE reg IN (  SELECT MIN(reg) 
            		FROM dprod_datetime
                    	GROUP BY MONTH(tanggal), YEAR(tanggal)
            	    )

            Hasil:

            +-------+---------------------+-------+
            | bulan | tanggal             | reg   |
            +-------+---------------------+-------+
            |    12 | 2016-12-05 03:17:13 |  1176 |
            |    11 | 2016-11-01 02:10:10 | 16243 |
            +-------+---------------------+-------+

          • Maaf mas agus membuat bingung,

            Jadi begini. ini tabel contoh Desember 2016.

            					
            idprod	|tanggal  	        |reg	|reproc
            30	|2016/12/01 0:00	|6554	|45454
            2	|2016/12/02 22:09	|15518	|400
            3	|2016/12/04 20:17	|1176	|600
            38	|2016/12/04 22:00	|1222	|342
            39	|2016/12/05 5:29	|456	|5677
            4	|2016/12/05 17:00	|10834	|50
            

            —————————————–
            Itu kan ada tanggal sama, sya ingin mengambil Tanggal berapa dan nilai max nya, (nilai max di sum by tanggal).
            jadi dalam 1 bulan hasil yg mau dicapai seperti dibawah ini.

            Hasil.

            ==============
            id	|hari	         |max_pReg |
            2	|2016-12-01	 |15518    |
            

            =====

            Dari hasil diatas permasalahannya adalah, hari yang ditampilkan tidak match dengan nilai tertinggi, harusnya nilai max 15518 adalah tanggal 2016-12-02. ini malah tanggal lain. sya cob

            === SCRIPT QUERY yang sya jalankan
            # SELECT tb_temp.id, tb_temp.hari, MAX(pReg) AS max_pReg
            FROM ( SELECT idperiod as id, date(tanggal) hari, date_format(tanggal, ‘%d’) as pTgl, SUM(reg) as pReg, SUM(reproc) as pReproc
            FROM dprod_datetime WHERE MONTH(tanggal)=12 AND year(tanggal)=2016 GROUP BY pTgl ORDER BY tanggal ASC ) AS tb_temp.

            ===== tabel nya

            (CREATE TABLE IF NOT EXISTS `dprod_datetime` (
              `idprod` int(10) NOT NULL,
              `tanggal` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
              `bulan` varchar(15) NOT NULL,
              `reg` int(20) NOT NULL,
              `reproc` int(20) DEFAULT NULL,
            ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
            )
            

            Mohon pencerhannya mas agus, mwtur suwun sanget.

          • Coba query ini mas:

            SELECT id_prod, tanggal, reg 
            FROM dprod_datetime
            WHERE reg = (  SELECT MAX(reg) 
            		FROM (	SELECT SUM(reg) AS reg
            			FROM dprod_datetime
            			WHERE MONTH(tanggal) = 12 AND YEAR(tanggal) = 2016
            			GROUP BY tanggal
            		) as tmp
                        )

            Hasil:

            +---------+---------------------+-------+
            | id_prod | tanggal             | reg   |
            +---------+---------------------+-------+
            |       2 | 2016-12-02 22:09:00 | 15518 |
            +---------+---------------------+-------+

          • Mas agus,

            Terimakasih jawaban2nya dan ilmunya., sudah bisa.

            Mas share tentang upload / insert file excel ke database.
            Terimakasih

            Aang

          • Sama sama mas…
            Iya mas, semoga bisa sempat merealisasikannya.
            Intinya ada dua cara mas:
            1. Baca file excel dengan library excel reader kemudian susun query insert, selanjutnya eksekusi query tersebut.
            2. Jika file sangat besar, hingga ratusan ribu rows, bisa disimpan dulu ke temporary file bentuk .csv kemudian gunakan statement LOAD LOCAL INFILE

          • saya mencoba dengan file bnyak berat, sampe time out, sya naikan sampe brp menit di php.ini nya.
            terus kendala lagi, data yg isinya float/decimal ga bisa input ke database dgn utuh alias dibulatkan ya?
            tks.

          • Ini file excelnya diupload pakai web mas?

            Coba di cek lagi, time outnya karena apa? Apa proses upload filenya, proses parsing data excelnya, atau proses insert datanya

            Data yang dimasukkan berapa row?

        • udah sya naikaan mas timeoutnya diatas 3menit..ehhe
          Mas bisa share tentang payrol dengan PHP?
          sya ingin sistem gaji seperti gaji pokok, tunjangan potongan2, bonus, lembur, nilai kerajinan.pph, saya googling masih blm menemukan sample yang pas..
          Kalau ada bisa dishare mas contohnya..
          hehehe.

          Suwun mas agus.

  • selamat malem mas agus….
    maaf ngganggu nich.
    mohon bantuannya ya mas

    Pemrograman menggunakan PHP
    database MySQL
    semua tipe data varchar (50)

    tabel DataKelas

    +--------+------------+------------+
    | Kelas  | Kelamin    | jumlah     |
    +--------+------------+------------+
    | 3IPA   | pria       |      19    |
    | 3IPA   | wanita     |      22    |
    | 3IPS   | pria       |      19    |
    | 3IPS   | wanita     |      22    |
    | 3IPS   | pria       |      19    |
    | 3BHS   | wanita     |      22    |
    | 3BHS   | pria       |      24    |
    | 2IPA   | pria       |      19    |
    | 2IPA   | wanita     |      22    |
    | 2IPS   | pria       |      19    |
    | 2IPS   | wanita     |      22    |
    | 2IPS   | pria       |      19    |
    | 2BHS   | wanita     |      22    |
    | 2BHS   | pria       |      24    |
    +--------+------------+------------+
    

    dari tabel DataKelas diatas saya ingin menjumlahkan dan mengelompokan data berdasarkan jenis kelamin dan hasil penjumlahan dimasukan pada tabel JenisKelamin dibawah ini

    tabel JenisKelamin

    +------------+--------+------------+
    |jurusan     | pria   | wanita     |
    +------------+--------+------------+
    | IPA        | ...    |  ...       |
    | IPS        |        |            |
    | BHS        |        |            |
    +------------+--------+------------+
    

    mohon petunjuk dan sarannya
    bagaimana script PHP nya untuk menyelesaikan permasalahan saya tersebut, sudah dua malem saya otak atik belum ketemu juga

    atas bantuannya saya ucapkan terimakasih 🙂

    • Intinya buat query sehingga format data sesuai dengan format tabel yang ingin dimasukkan datannya mas.
      Query:

      SELECT kelas, 
      	COUNT(IF(kelamin = "pria", 1, NULL)) AS pria,
      	COUNT(IF(kelamin = "wanita", 1, NULL)) AS wanita
      FROM DataKelas
      GROUP BY kelas

      Hasil:

      +-------+------+--------+
      | kelas | pria | wanita |
      +-------+------+--------+
      | 2BHS  |    1 |      1 |
      | 2IPA  |    1 |      1 |
      | 2IPS  |    2 |      1 |
      | 3BHS  |    1 |      1 |
      | 3IPA  |    1 |      1 |
      | 3IPS  |    2 |      1 |
      +-------+------+--------+

      Selanjutnya tinggal gunakan statement INSERT intuk memasukkan data hasil query tersebut

      INSERT INTO JenisKelamin
      SELECT kelas, 
      	COUNT(IF(kelamin = "pria", 1, NULL)) AS pria,
      	COUNT(IF(kelamin = "wanita", 1, NULL)) AS wanita
      FROM DataKelas
      GROUP BY kelas

      Untuk kode PHPnya tinggal jalankan query diatas mas:

      <?php
      $conn = mysqli_connect('localhost', 'root', '', 'test');
      $query = mysqli_query($conn,
      			"INSERT INTO JenisKelamin
      			SELECT kelas, 
      				COUNT(IF(kelamin = 'pria', 1, NULL)) AS pria,
      				COUNT(IF(kelamin = 'wanita', 1, NULL)) AS wanita
      			FROM DataKelas
      			GROUP BY kelas"
      		);

      • maaf mas maksud pertanyaan saya adalah menjumlahkan semua jumlah siswa laki2 dan jumlah semua perempuan berdasarkan jurusan (IPA, IPS & BHS) kemudian hasil penjumlahannya di masukan pada tabel yg lain.

        tabel DataKelas

        +--------+------------+------------+
        | Kelas  | Kelamin    | jumlah     |
        +--------+------------+------------+
        | 3IPA   | pria       |      19    |
        | 3IPA   | wanita     |      22    |
        | 3IPS   | pria       |      19    |
        | 3IPS   | wanita     |      22    |
        | 3IPS   | pria       |      19    |
        | 3BHS   | wanita     |      22    |
        | 3BHS   | pria       |      24    |
        | 2IPA   | pria       |      19    |
        | 2IPA   | wanita     |      22    |
        | 2IPS   | pria       |      19    |
        | 2IPS   | wanita     |      22    |
        | 2IPS   | pria       |      19    |
        | 2BHS   | wanita     |      22    |
        | 2BHS   | pria       |      24    |
        +--------+------------+------------+
        

        yang di jumlahkan adalah
        19 org pria di kelas 3IPA dan 19 org pria di kelas 2IPA hasilnya 38 dan kemudian dimasukan ke tabel jenis kelamin.
        22 org wanita di kelas 3IPA dan 22 org wanita di kelas 2IPA hasilnya 44 dan kemudian dimasukan ke tabel jenis kelamin.

        hasil penjumlahan di tabel JenisKelamin

        +------------+--------+------------+
        |jurusan     | pria   | wanita     |
        +------------+--------+------------+
        | IPA        | 38     |  44        |
        | IPS        |        |            |
        | BHS        |        |            |
        +------------+--------+------------+
        

        jadi yg masih saya bingun scrip php untuk menjumlahkan 19 org pria kelas 3IPA dan 19 org pria kelas 2IPA dan hasilnya 38 dan dimasukan ke tabel JenisKelamin

        maturnuwon 🙂

        • Oh, begitu ya mas…
          Ada dua cara mas, bisa dari sisi SQL nya atau PHP nya. Karena artikel terkait dengan SQL, saya bahas dari sisi SQL ya mas:
          Pertama, karena kelas tidak memiliki ID, maka kita perlu buat data kelas dengan jurusan utama yang sama:

          SELECT CASE WHEN kelas LIKE "%IPA" THEN 'IPA'
                      WHEN kelas LIKE "%IPS" THEN 'IPS'
                      WHEN kelas LIKE "%BHS" THEN 'BHS'
                 END AS jurusan_utama,
                 kelamin, 
                 jumlah
          FROM DataKelas

          Hasilnya:

          +---------------+---------+--------+
          | jurusan_utama | kelamin | jumlah |
          +---------------+---------+--------+
          | IPA           | pria    | 19     |
          | IPA           | wanita  | 22     |
          | IPS           | pria    | 19     |
          | IPS           | wanita  | 22     |
          | IPS           | pria    | 19     |
          | BHS           | wanita  | 22     |
          | BHS           | pria    | 24     |
          | IPA           | pria    | 19     |
          | IPA           | wanita  | 22     |
          | IPS           | pria    | 19     |
          | IPS           | wanita  | 22     |
          | IPS           | pria    | 19     |
          | BHS           | wanita  | 22     |
          | BHS           | pria    | 24     |
          +---------------+---------+--------+

          Selanjutnya kita jumlahkan siswa berdasarkan jurusan utama:

          SELECT jurusan_utama, 
          	SUM(IF(kelamin = "pria", jumlah, NULL)) AS pria,
          	SUM(IF(kelamin = "wanita", jumlah, NULL)) AS wanita
          FROM (
          	SELECT CASE WHEN kelas LIKE "%IPA" THEN 'IPA'
          		    WHEN kelas LIKE "%IPS" THEN 'IPS'
          		    WHEN kelas LIKE "%BHS" THEN 'BHS'
          		END AS jurusan_utama,
          		kelamin, 
          		jumlah
          	FROM DataKelas
          ) as tbl_kelas 
          GROUP BY jurusan_utama

          Hasilnya:

          +---------------+------+--------+
          | jurusan_utama | pria | wanita |
          +---------------+------+--------+
          | BHS           |   48 |     44 |
          | IPA           |   38 |     44 |
          | IPS           |   76 |     44 |
          +---------------+------+--------+
          

          Selanjutnya kita tambahkan query untuk memasukkan data:

          INSERT INTO JenisKelamin
          SELECT jurusan_utama, 
          	SUM(IF(kelamin = "pria", jumlah, NULL)) AS pria,
          	SUM(IF(kelamin = "wanita", jumlah, NULL)) AS wanita
          FROM (
          	SELECT CASE WHEN kelas LIKE "%IPA" THEN 'IPA'
          		    WHEN kelas LIKE "%IPS" THEN 'IPS'
          		    WHEN kelas LIKE "%BHS" THEN 'BHS'
          		END AS jurusan_utama,
          		kelamin, 
          		jumlah
          	FROM DataKelas
          ) as tbl_kelas 
          GROUP BY jurusan_utama

          Untuk script PHP nya, sama dengan jawaban saya sebelumnya:

          <?php
          $conn = mysqli_connect('localhost', 'root', '', 'test');
          $query = mysqli_query($conn,
          			"INSERT INTO JenisKelamin
          			SELECT jurusan_utama, 
          				SUM(IF(kelamin = "pria", jumlah, NULL)) AS pria,
          				SUM(IF(kelamin = "wanita", jumlah, NULL)) AS wanita
          			FROM (
          				SELECT CASE WHEN kelas LIKE "%IPA" THEN 'IPA'
          						WHEN kelas LIKE "%IPS" THEN 'IPS'
          						WHEN kelas LIKE "%BHS" THEN 'BHS'
          					END AS jurusan_utama,
          					kelamin, 
          					jumlah
          				FROM DataKelas
          			) as tbl_kelas 
          			GROUP BY jurusan_utama"
          		);

  • selamat Pagi Mas agus mohon masukannya :
    saya punya Query spt berikut

    SELECT `no_penjualan`,`NIK`, `kd_item`,`bulan`,`tahun`,`jumlah`, (SELECT ROUND(AVG(`jumlah`)) FROM tbpenjualan WHERE `no_penjualan` a.`no_penjualan` – 4) AS forecast, (SELECT jumlah – forecast) As eror, (SELECT jumlah – forecast /3 ) As MAE, (SELECT eror * eror ) As MSE FROM tbpenjualan a where kd_item =’v5′

    UNION ALL

    SELECT “” AS no_penjualan,
    “” AS NIK,
    “” AS kd_item,
    “” AS bulan,
    “Grand Total” as tahun,
    SUM(`jumlah`) AS jumlah,
    SUM(‘forecast’) AS forecast,
    SUM(‘eror’) as eror,
    sum(‘MAE’)as MAE,
    sum(‘MSE’) as MSE
    FROM tbpenjualan

    hasilnya : https://s27.postimg.org/ue2altlhv/SUM.jpg

    saya bingung mau nambahin query :

    SELECT MIN(`no_penjualan`)+3 as `no_penjualan` from tbpenjualan

    masud saya itu biar nanti hasil Grand totalnya itu hanya menghitung dari Apr sd des dstnya aja.
    terima kasih.

  • met sore mas agus, maaf ganggu nih…
    mohon bantuannya ya mas

    ada 4 tabel:

    Table name : port_bg			
    bg_id | bg_tugboat | bg_tongkang | mv_id
    1	Jhoni 1	     Liana 1	     1
    2	Jhoni 2	     Liana 2	     1
    3       Jhoni 3	     Liana 3	     1
    4	Jhoni 4	     Liana 4         1
    5	Jhoni 5	     Liana 5	     1
    
    Table nama : port_conveyor		
    bg_id |conv_name | conv_tonase
    1	Conveyer 1	2.000
    1	Conveyer 2	1.000
    1	Conveyer 3	3.000
    2	Conveyer 4	3.000
    2	Conveyer 5	2.500
    3	conveyor 2	1.500
    3	conveyor 3	1.750
    3	conveyot 4	2.250
    3	conveyor 5	1.500
    4	Bangun Artha	7.500
    5	Bangun Artha	4.500
    5	Conveyor 1	4.000
    
    Table name : port_mv			
    mv_id | mv_date     | mv_name           | mv_shipper
    1	12/01/2012    MV. EASTERN VIEW	  jaya abadi
    
    Table name : port_mv_detail				
    mv_id_detail | mv_id | no_urut| bg_id |	mv_cargo
    1	        1	  1	  3	7.000
    2               1	  2	  2	5.500
    3	        1	  3	  4	7.500
    4	        1	  4	  5	8.000
    5	        1	  5	  1	6.000
    

    dari tabel diatas saya mau buat perintah sql untuk menampilkan data seperti ini:

    mv_date          mv_name	        mv_shipper	tugboat1    tongkang1	bg_cargo1	mv_cargo1	Return1
    12/01/2012	 MV. EASTERN VIEW	jaya abadi	Jhoni 3	    Liana 3	7.000        	7.000	        0
    

    note: bg_cargo1 di ambil dari summary conv_tonase yang ada pada table port_conveyor
    return1 didapat dari summary bg_cargo dikurang mv_cargo

    mohon pencerahannya mas agus 🙂

    • Coba pakai query ini mas:

      SELECT pm.mv_id, mv_date, mv_name, mv_shipper, bg_tugboat, bg_tongkang, 
      		SUM(conv_tonase) as bg_cargo1, mv_cargo, SUM(conv_tonase) - mv_cargo AS return1
      FROM port_mv pm
      LEFT JOIN port_mv_detail USING(mv_id)
      LEFT JOIN port_bg USING(bg_id)
      LEFT JOIN port_conveyor USING(bg_id)
      WHERE bg_id = 3

      Hasil:

      +-------+------------+------------------+------------+------------+-------------+-----------+----------+---------+
      | mv_id | mv_date    | mv_name          | mv_shipper | bg_tugboat | bg_tongkang | bg_cargo1 | mv_cargo | return1 |
      +-------+------------+------------------+------------+------------+-------------+-----------+----------+---------+
      |     1 | 12/01/2012 | MV. EASTERN VIEW | jaya abadi | Jhoni3     | Liana3      |      7000 |     7000 |       0 |
      +-------+------------+------------------+------------+------------+-------------+-----------+----------+---------+

  • kalau mau menambah seperti ini:

    mv_date|mv_name|mv_shipper|tugboat1|tongkang1|bg_cargo1|mv_cargo1|Return1|tugboat2|tongkang2|bg_cargo2|mv_cargo2|Return2|
    12/01/2012 MV. EASTERN VIEW Arutmin Jhoni 3 Liana 3 7.000 7.000 0 Jhoni 2 Liana 2 5.500 5.500 0

    sebenarnya sampai 5 mas agus, tapi karena kepanjangan jd ambil sampai 2 sbg contoh.. kalau begini kira2 bagaimana query nya mas agus… maaf ngerepotin mas agus

  • kalo menambah satu kolom lagi buat rangking gimana, saya sudah coba berbagai query untuk disatukan dengan query diatas kok gk ada yang cocok ya? bagaimana ya susunan querynya

      • SELECT ID_SISWA, NAMA, 
        	SUM(IF(SEMESTER = 1 AND ID_KELAS='$idkelas', NILAI_AKHIR, 0)) AS 'Semester 1',
        	SUM(IF(SEMESTER = 2 AND ID_KELAS='$idkelas', NILAI_AKHIR, 0)) AS 'Semester 2',
        	SUM(NILAI_AKHIR) AS TOTAL
        FROM nilai_akhir
        LEFT JOIN profilsiswa ON profilsiswa.ID_AKUN_SISWA=nilai_akhir.ID_SISWA
        GROUP BY ID_SISWA ORDER BY TOTAL DESC
        

        datanya dibawah ini , agak berantakan, gunakan phpmyadmin

        CREATE TABLE `nilai_akhir` (
          `ID_NILAI_TOTAL` int(11) NOT NULL,
          `ID_SISWA` int(11) NOT NULL,
          `ID_KELAS` int(11) NOT NULL,
          `ID_MAPEL` int(11) NOT NULL,
          `STATUS_MAPELA` varchar(20) NOT NULL,
          `STATUS` varchar(20) NOT NULL,
          `SEMESTER` int(11) NOT NULL,
          `NILAI_AKHIR` int(11) NOT NULL
        ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
        
        --
        -- Dumping data for table `nilai_akhir`
        --
        
        INSERT INTO `nilai_akhir` (`ID_NILAI_TOTAL`, `ID_SISWA`, `ID_KELAS`, `ID_MAPEL`, `STATUS_MAPELA`, `STATUS`, `SEMESTER`, `NILAI_AKHIR`) VALUES
        (1, 4, 1, 1, 'Mata Pelajaran', 'Nilai Umum', 1, 100),
        (2, 4, 1, 1, 'Mata Pelajaran', 'Nilai Praktik', 1, 85),
        (3, 5, 1, 1, 'Mata Pelajaran', 'Nilai Umum', 1, 100),
        (4, 5, 1, 1, 'Mata Pelajaran', 'Nilai Praktik', 1, 80),
        (5, 4, 1, 2, 'Mata Pelajaran', 'Nilai Umum', 1, 80),
        (6, 5, 1, 2, 'Mata Pelajaran', 'Nilai Umum', 1, 100),
        (7, 4, 1, 2, 'Mata Pelajaran', 'Nilai Praktik', 1, 80),
        (8, 5, 1, 2, 'Mata Pelajaran', 'Nilai Praktik', 1, 100),
        (9, 4, 1, 3, 'Mata Pelajaran', 'Nilai Praktik', 1, 100),
        (10, 5, 1, 3, 'Mata Pelajaran', 'Nilai Praktik', 1, 75),
        (11, 4, 1, 3, 'Mata Pelajaran', 'Nilai Umum', 1, 100),
        (12, 5, 1, 3, 'Mata Pelajaran', 'Nilai Umum', 1, 78),
        (13, 6, 1, 1, 'Mata Pelajaran', 'Nilai Umum', 1, 60),
        (14, 6, 1, 1, 'Mata Pelajaran', 'Nilai Praktik', 1, 100);
        

        • Saya coba hilangkan join nya ya mas, soalnya tabel profilsiswa tidak ada.

          Apa yang dimaksud seperti ini?

          SELECT ID_SISWA,
                  SUM(IF(SEMESTER = 1 AND ID_KELAS=1, NILAI_AKHIR, 0)) AS 'Semester 1',
                  SUM(IF(SEMESTER = 2 AND ID_KELAS=1, NILAI_AKHIR, 0)) AS 'Semester 2',
                  SUM(NILAI_AKHIR) AS TOTAL,
                  @row_num := @row_num + 1 AS rangking
          FROM nilai_akhir, (SELECT @row_num := 0) AS nilai_awal
          GROUP BY ID_SISWA ORDER BY TOTAL DESC

          Hasil:

          +----------+------------+------------+-------+----------+
          | ID_SISWA | Semester 1 | Semester 2 | TOTAL | rangking |
          +----------+------------+------------+-------+----------+
          |        4 |        545 |          0 |   545 |        1 |
          |        5 |        533 |          0 |   533 |        2 |
          |        6 |        160 |          0 |   160 |        3 |
          +----------+------------+------------+-------+----------+

          • waktu saya copy paste sintax nya kok ada yang error ya mas??

            #1064 – You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ‘LIMIT 0, 25’ at line 6

            trimakasih mas sebelumnya udah mau bantu,

          • Sama sama mas….

            Coba dicek lagi mas, mungkin ada kesalahan penulisan syntax di akhir query atau tipe data yang tidak sesuai?
            Coba di break dan dijalankan lagi query nya satu per satu dan diperhatikan errornya pada bagian query yang mana.

          • Mencobanya di phpMyAdmin ya mas? phpMyAdmin memang kadang seperti itu, dia menambahkan klausa LIMIT untuk membatasi hasil query yang ditampilkan namun terkadang penambahannya tidak pas pada tempatnya, sehingga malah error.

            Untuk mengatasinya, coba dibalik urutannya mas, menjadi:

            SELECT ID_SISWA,
                    SUM(IF(SEMESTER = 1 AND ID_KELAS=1, NILAI_AKHIR, 0)) AS 'Semester 1',
                    SUM(IF(SEMESTER = 2 AND ID_KELAS=1, NILAI_AKHIR, 0)) AS 'Semester 2',
                    SUM(NILAI_AKHIR) AS TOTAL,
                    @row_num := @row_num + 1 AS rangking
            FROM (SELECT @row_num := 0) AS nilai_awal, nilai_akhir
            GROUP BY ID_SISWA ORDER BY TOTAL DESC

          • sudah bisa mass, dengan query yang dibalik, trimakasih mas,, penjelasan anda sangat sangat membantu, ku baru tahu juga ada pengaruh menggunakan phpadmin

          • ada kasus lagi mas,

            ketika nilai total saya hapus kok malah error ya, tujuannya saya ingin memunculkan rangking disetiap semesternya, mohon bantuannya,

            sebenarnya @row_num := @row_num itu apa mas?? bisa dijelaskan sedikit,??

          • Ada contoh lengkapnya hasil yang diinginkan seperti apa mas?
            Query yang error seperti apa?

            Sebenarya kita hanya membuat nomor urut saja mas. kita gunakan variabel bernama row_num, untuk menulis variabel, gunakan @, untuk memberi nilai, gunakan :=

            Ketika meng eksekusi query, pertama2 MySQL akan membaca bagian FROM, pada bagian tersebut kita definisikan variabel @row_num dengan nilai 0, setelah nilai variabel tersimpan, selanjutnya ketika mengeksekusi statemen SELECT, maka nilai @row_num akan selalu bertambah satu

            Pendefinisian variabel didalam select untuk memudahkan agar menjadi satu statemen, contoh lain:

            SET @rangking := 0;
             
            SELECT ID_SISWA,
                    SUM(IF(SEMESTER = 1 AND ID_KELAS=1, NILAI_AKHIR, 0)) AS 'Semester 1',
                    SUM(IF(SEMESTER = 2 AND ID_KELAS=1, NILAI_AKHIR, 0)) AS 'Semester 2',
                    SUM(NILAI_AKHIR) AS TOTAL,
                    @rangking := @rangking + 1 AS rangking
            FROM nilai_akhir
            GROUP BY ID_SISWA ORDER BY TOTAL DESC

          • Selamat malam mas Agus, saya nyoba coding seperti ini

            SELECT no_fad,
                    SUM(IF(kd_transaksi = 'T' , jml_transaksi, 0)) AS 'tarik',
                    SUM(IF(kd_transaksi = 'S' , jml_transaksi, 0)) AS 'setor',
                    SUM(jml_transaksi) AS total   
            FROM ss GROUP BY no_fad
            

            hasilnya

            no_fad	tarik	setor	total
                1	1000	2000	3000
                2	 500	1000    1500
            

            yang saya butuhkan total itu menjadi setor – tarik jadi seperti ini:

            no_fad	tarik	setor	total
               1	1000	 2000	1000
               2	 500	  1000	500
            

            mohon bantuannya mas, apa yang harus dirubah dari koding saya ya? terima kasih sebelumnya.

          • Coba ini mas:

            <pre>
            SELECT no_fad,
                    SUM(IF(kd_transaksi = 'T' , jml_transaksi, 0)) AS 'tarik',
                    SUM(IF(kd_transaksi = 'S' , jml_transaksi, 0)) AS 'setor',
                    SUM(IF(kd_transaksi = 'S' , jml_transaksi, 0)) - SUM(IF(kd_transaksi = 'T' , jml_transaksi, 0)) AS total   
            FROM ss GROUP BY no_fad
            </pre>

  • pak saya ada kasus penjumlahan di query , tapi ko yg proses bervariabel hasilnya NULL di subtotal dan pajak

    SELECT username,
    nama,
    SUM(IF( jenis = ‘trx1’, bayar, 0)) AS jml_trx1,
    SUM(IF( jenis = ‘trx2’, bayar, 0)) AS jml_trx2,
    SUM(IF( jenis = ‘trx3’, bayar, 0)) AS jml_trx3,
    SUM(IF( jenis = ‘trx4’, bayar, 0)) AS jml_trx4,
    @total:=SUM(bayar) AS TOTAL,
    @jml:= SUM(bayar) * 0.02 AS jml_bag1,
    @sub1:=@total-@jml1 AS subtotal,
    $pajak:=@sub1*0.01 AS pajak

    FROM transaksi
    LEFT JOIN member USING(username)
    GROUP BY username

      • username nama jml_trx1 jml_trx2 jml_trx3 jml_trx4 TOTAL jml_bag1 subtotal pajak
        BK1000001 MASTER 2120700 375000 47000 0 2542700 50854 NULL NULL
        BK1000002 SITI AISYAH 267500 6000 0 0 273500 5470 NULL NULL
        BK1000003 SITI HARYATI 242500 6000 0 0 248500 4970 NULL NULL
        BK1000004 EUIS ALTHEA 187500 6000 0 0 193500 3870 NULL NULL
        BK1000005 KEN AROK 245000 6000 0 0 251000 5020 NULL NULL

        yg diinginkan subtotal berasal dari TOTAL-jml_bag1 dan pajak 10 dari subbtotal

          • itu data hasil transaksi kurang lebih datanya sepert ini

            username bayar jenis
            BK1000033 12500 trx1
            BK1000001 125000 trx1
            BK1000002 125000 trx1
            BK1000001 62500 trx2
            BK1000003 125000 trx2
            BK1000002 62500 trx3
            BK1000001 25000 trx4

          • Jika mengisi nilai variabel dari fungsi agregasi maka hasilnya menjadi tidak pas mas, karena penggabungan row nya tidak sinkron dengan pendefinisian variabel, coba bandingkan yang ini:

            SELECT username,
            	SUM(IF( jenis = 'trx1', bayar, 0)) AS jml_trx1,
            	SUM(IF( jenis = 'trx2', bayar, 0)) AS jml_trx2,
            	SUM(IF( jenis = 'trx3', bayar, 0)) AS jml_trx3,
            	SUM(IF( jenis = 'trx4', bayar, 0)) AS jml_trx4,
            	SUM(bayar) AS TOTAL,
            	ROUND ( SUM(bayar) * 0.02 ) AS jml_bag1,
            	ROUND ( SUM(bayar)-(SUM(bayar) * 0.02) ) AS subtotal,
            	ROUND ( (SUM(bayar)-(SUM(bayar) * 0.02)) * 0.01 ) AS pajak
            FROM transaksi
            GROUP BY username

            Hasil:

            +-----------+----------+----------+----------+----------+--------+----------+----------+-------+
            | username  | jml_trx1 | jml_trx2 | jml_trx3 | jml_trx4 | TOTAL  | jml_bag1 | subtotal | pajak |
            +-----------+----------+----------+----------+----------+--------+----------+----------+-------+
            | BK1000001 |   125000 |    62500 |        0 |    25000 | 212500 |     4250 |   208250 |  2083 |
            | BK1000002 |   125000 |        0 |    62500 |        0 | 187500 |     3750 |   183750 |  1838 |
            | BK1000003 |        0 |   125000 |        0 |        0 | 125000 |     2500 |   122500 |  1225 |
            +-----------+----------+----------+----------+----------+--------+----------+----------+-------+

            Sama ini:

            SELECT username,
            	bayar,
            	@total := bayar AS total,
            	@jml:= ROUND(bayar * 0.02) AS jml_bag1,
            	@sub1 := @total-@jml AS subtotal,
            	@pajak:= ROUND(@sub1*0.01) AS pajak
            FROM transaksi

            Hasil:

            +-----------+--------+--------+----------+----------+-------+
            | username  | bayar  | total  | jml_bag1 | subtotal | pajak |
            +-----------+--------+--------+----------+----------+-------+
            | BK1000001 | 125000 | 125000 |     2500 |   122500 |  1225 |
            | BK1000002 | 125000 | 125000 |     2500 |   122500 |  1225 |
            | BK1000001 |  62500 |  62500 |     1250 |    61250 |   612 |
            | BK1000003 | 125000 | 125000 |     2500 |   122500 |  1225 |
            | BK1000002 |  62500 |  62500 |     1250 |    61250 |   612 |
            | BK1000001 |  25000 |  25000 |      500 |    24500 |   245 |
            +-----------+--------+--------+----------+----------+-------+

  • Gan mohon bantuannya saya memiliki tabel bernama biodata_wni yang berisi beberapa field diantaranya NIK | NAMA | TANGGAL_LHR | JENIS_KLMIN | AKTA_LHR | NO_AKTA_LHR | FLAG_STATUS. Bagai mana menampilkan jumlah dan prosentase kepemilikan akta dan tidak memiliki berdasarkan jenis kelamin. Gimana memodifikasi script jika scripnya seperti ini :

    select
    cc no
    ,case when cc is null then ‘JUMLAH’ else
    getnamakec(cc,ck,cp) end kecamatan
    ,sum(ja)+sum(jt) as jml_00_18
    ,sum(ja)jml_ada,round(sum(ja)*100/(psn),2) psn_ada
    ,sum(jt)jml_tdk,round(sum(jt)*100/(psn),2) psn_tdk
    ,” keterangan
    from
    (
    select
    no_prop cp,no_kab ck,no_kec cc
    ,case when akta_lhr in(2) then 1 else 0 end ja
    ,case when akta_lhr in(1) then 1 else 0 end jt
    ,(select count(*)
    from biodata_wni where flag_status in(‘0’)
    and floor(months_between(‘1-JAN-2012’,tgl_lhr)/12)
    between 0 and 18
    ) psn
    from biodata_wni where flag_status in(‘0′)
    and floor(months_between(’30-JUN-2016’,tgl_lhr)/12)
    between 0 and 18
    )
    group by
    grouping sets((cp,ck,cc,psn)
    ,(cp,ck,psn)
    )
    order by 1;

    Terima kasih sebelumnya semoga mendapat jawaban

      • Untuk contoh data kolom nama berisi nama, tanggal_lhr berisi ddmmyyyy, jenis_klmin berisi angka 1 untuk laki2 dan 2 untuk perempuan, akta_lhr berisi angka 1 jika tdk memiliki dan 2 memiliki, no_akta_lhr berisi nomor akta, flagstatus berisi angka 0. Dan untuk outputnya NO | KECAMATAN | JUMLAH LAKI2 | JUMLAH PEREMPUAN | KETERANGAN. dibawah kolom jumlah laki2 ada sub kolom lagi ADA AKTA | % ADA | TDK ADA AKTA | % TDK ADA . Begitu pula pada kolom jumlah perempuan. Maaf gan nulisnya melalui handphone jadi ribet dah

        Lupa gan dalam script itu ada 0 and.18 maksunya filter untuk usia 0 s/d 18 tahun saja

        • Apa maksudnya seperti ini mas?

          nama  | tanggal_lhr | jenis_klmin | akta_lhr | no_akta_lhr | flagstatus
          nama  | 10071988    | 1           | 1        | 12          | 0
          nama2 | 12011990    | 2           | 2        | 22          | 0
          

          Output:

           NO | KECAMATAN |              JUMLAH LAKI2                   |                 JUMLAH PEREMPUAN            | KETERANGAN |
              |           | ADA AKTA | % ADA | TDK ADA AKTA | % TDK ADA | ADA AKTA | % ADA | TDK ADA AKTA | % TDK ADA |            |
          

          Menghitung persentasenya seperti apa mas? apa dibagi apa?

  • Assalamualaikum pak agus saya ingin meminta solusi bagaimana jika menggabungkan antara count dengan max? Jadi, pertama saya ingin meng-cout jumlah record yg value-nya adalah x, lalu saya ingin max var x tersebut.

    id| nama_panggilan | jenis_klmin | kehadiran | tanggal |
    1 | Lorem | 1 | 3 | 2017-02-03 |
    2 | Ipsum | 2 | 4 | 2017-02-03 |
    3 | Lorem | 1 | 2 | 2017-02-04 |
    4 | Ipsum | 2 | 1 | 2017-02-04 |
    5 | Lorem | 1 | 5 | 2017-03-01 |
    6 | Ipsum | 2 | 3 | 2017-03-02 |

    Nah, si var x itu bisa berisi 4 /3 /2. Begitu kurang lebih yg ingin saya tanya kan pak hehe
    Terima Kasih sebelumnya

    Wassalamualaikum …

  • Saya punya 4 Tabel
    anggota (kode_anggota, nama_anggota)
    wajib(kode_anggota, masuk, keluar)
    manasuka(kode_anggota, masuk, keluar)
    pokok(kode_anggota, masuk, keluar)
    Bagaimana caranya kalau saya ingin menampilkan data dengan urutan :
    (kode_anggota, nama_anggota, sum(wajib.masuk-wajib.keluar), sum(manasuka.masuk–manasuka.keluar), sum(pokok.masuk–pokok.keluar), jumlah (sum(wajib.masuk–wajib.keluar) + sum(manasuka.masuk–manasuka.keluar) + sum(pokok.masuk–pokok.keluar)). Terima kasih

    • Secara umum, gunakan JOIN mas, misal:

      SELECT kode_anggota, nama_anggota, 
      	SUM(wajib.masuk-wajib.keluar), 
      	SUM(manasuka.masuka-manasuka.keluar), 
      	SUM(pokok.masuk–pokok.keluar), 
      	SUM(wajib.masuk-wajib.keluar) 
      		+ SUM(manasuka.masuk-manasuka.keluar) 
      		+ SUM(pokok.masuk-pokok.keluar)
      		AS jumlah
      FROM anggota
      LEFT JOIN wajib USING(kode_anggota)
      LEFT JOIN manasuka USING(kode_anggota)
      LEFT JOIN pokok USING(kode_anggota)

      Akan lebih mudah menjawabnya jika ada contoh tabel data dan output tabel yang diinginkan mas…

  • mau nanya mas kalo misalkan saya punya data seperti ini :

    | nama | tgl trf    | jml trf |
    | Budi | 2017-03-31 | 43000 |
    | Budi | 2017-04-01 | 45000 |
    | Budi | 2017-04-05 | 50000 |
    | Iwan | 2017-03-30 | 43000 |
    | Iwa n| 2017-03-31 | 43000 |
    

    Pengen jadi seperti ini gimna ya mas

    | nama    | tgl trf    | jml trf |
    | Budi    | 2017-03-31 | 43000 |
    | ------  | 2017-04-01 | 45000 |
    | ------  | 2017-04-05 | 50000 |
    TOTAL    -----------    138000
    | Iwan    | 2017-03-30 | 43000 |
    | ------- | 2017-03-31 | 43000 |
    TOTAL   -----------      86000 
    TOTAL KES ---------     224000
    

    Terimaksih

  • siang pak,, jika ingin menjumlahkan hasil data yang dipangkatkan dalam satu field itu gmna ya pak..?
    misal dalam field c1 ada data nilai 2,3,4 dan n (ketika data diperbarui atau ditambah).. nah gimana caranya membuat perhitungan (2^2)+(3^2)+(4^2)+(n^2).. mohon pencerahannya pak…

      • berarti klau ingin mencari hasil jumlah dari (2^2)+(3^2)+(4^2)+(n^2) menggunakan SELECT sum(POW(c1, 2)) FROM tabel gitu pak?? krna saya coba sum(POW(c1, 2)) hasilnya tidak sama dengan menggunakan excel. bisa dikasih contoh pak..?

        dan tanya lagi pak kenapa kalau saya menggunakan coding ini $d1 = max (array($c1)); kok hasilnya gak keluar sesuai data pak?? padahal hasil dari variabel $c1 itu adalah 0.002, 0.002, 0.01, 0.002, 0.006 ,n. seharusnya itu kan yg muncul 0.01 krna paling besar, tp hasilnya yg muncul malah 0.006 pak,, saya ganti dari max ke min pun ya tetap 0.006 hasilnya,,mohon pencerahannya pak,,

        • mohon maaf bapak agus,,untuk maslah yang pertama sudah beres ternyata memang dtambah sum,,

          dan mksud pertanyaan saya yang kedua itu kan $c1 mrupakan hasil kalkulasi dari sum(POW(c1, 2)) itu td dengan data lain pak,,kan otomatis datanya ya akan banyak sesuai jumlah baris pada field,, jadi saya ingin mencari nilai maksimal dari $c1 itu dan menggunakan coding $d1 = max (array($c1));,,tp hasilnya kok tetep meskipun dibuat min jg,,

  • hh mohon maaf bapak agus,,gini lo maksd saya,,

    $crsum = mysql_query(“SELECT sum(pow(c1,2)) as sumK1 FROM nilaicpj”);
    $sum = mysql_fetch_array($crsum);

    $kaa1 = round($dt4[‘c1’]/sqrt($sum3[‘sumK1’]),2); // ini ditampilkan ditabel
    $ba1 = round(($kaa1*0.467),2); // ini ditampilkan ditabel
    $c1 = round(($ba1*$rata1),4); // ini ditampilkan ditabel
    $d1 = max (array($c1));

    nah untuk mencari nilai maximum dr hasil kalkulasi itu kok gak bisa ya pak,, kan seharusnya data di $c1 itu banyak data krna hasil kalkukasi dr tabel nilaicpj pada field c1,,inginnya diambil nilai maximal.nya pak,,mohon pencerahaanya,,

    • Coba sampple tabel c1 nya mas seperti apa?
      Kodenya ngga komplet ya mas? banyak variable baru seperti $dt4[‘c1’], $sum3[], tidak tahu asalnya dari mana. coba contoh datanya seperti apa dan output yang diinginkan seperti apa?

      • ini pak tabelnya dr db dan ditampilkan sperti ini juga di php ;

        |c1 | c2 | c3  | c4  |
        |a1 | 3  | 5   | 1   |
        |a2 | 3  | 5   | 5   |
        |a3 | 3  | 5   | 5   |
        |a4 | 1  | 3   | 3   |
        |a5 | 3  | 5   | 1   |
        

        kemudian dikalkulasi dimana sesuai rumus 3/akar dr ((3^2)+(3^2)+(3^2)+(1^2)+(3^2)) yg hasilnya 0,49 ditaruh di baris a1 dan kolom c1,dst,
        ini berhasil dg coding $crsum = mysql_query(“SELECT sum(pow(c1,2)) as sumK1 FROM nilaicpj”);
        $sum = mysql_fetch_array($crsum);
        $kaa1 = round($dt4[‘c1’]/sqrt($sum3[‘sumK1’]),2);
        yg mana $dt4[‘c1’] untuk menampilkan data asli c1 dan $sum3[‘sumK1’]) untuk memanggil sum(pow(c1,2)).
        kemudian ditampilkan jadi seperti ini ;

        |c1|c2  |c3  |c4  |
        |a1|0,49|0,47|0,16|
        |a2|0,49|0,47|0,47|
        |a3|0,49|0,47|0,47|
        |a4|0,16|0,49|0,49|
        |a5|0,49|0,47|0,16|
        |sum|  ?|  ? | ?  |
        |max|  ?|  ? | ?  |
        |min|  ?|  ? | ?  |
        

        nah untuk menampilkan nilai max,min dan sum nya gmna pak??,,sedangkan data a1-a5 itu nanti bisa bertambah a6 a7 dsb dan jg bisa berkurang.,mohon pencerahannya pak agus,,,

          • kan data awal a4c1 = 1 pak,,jd dihitung dg rumus 1/akar((3^2)+(3^2)+(3^2)+(1^2)+(3^2)+(n)),,begitu jg dg data a4c2 = 3, dan dihitung dg rumus 3/akar((5^2)+(5^2)+(5^2)+(3^2)+(5^2)+(n))

            maaf tabel saya salah,,c4 tu tidak ada.

            |   |c1 | c2 | c3  |
            |a1 | 3 | 5  | 1   |
            |a2 | 3 | 5  | 5   |
            |a3 | 3 | 5  | 5   |
            |a4 | 1 | 3  | 3   |
            |a5 | 3 | 5  | 1   |
            

            setelah dikalkulasi,,

            |  |c1  |c2  | c3 |
            |a1|0,49|0,47|0,12|
            |a2|0,49|0,47|0,64|
            |a3|0,49|0,47|0,64|
            |a4|0,16|0,28|0,38|
            |a5|0,49|0,47|0,12|
            |sum|  ?|  ? | ?  |
            |max|  ?|  ? | ?  |
            |min|  ?|  ? | ?  |
            

          • Pakai SQL saja sudah cukup mas:
            Tabel:

            +------+------+------+------+
            | c0   | c1   | c2   | c3   |
            +------+------+------+------+
            | a1   |    3 |    5 |    1 |
            | a2   |    3 |    5 |    5 |
            | a3   |    3 |    5 |    5 |
            | a4   |    1 |    3 |    3 |
            | a5   |    3 |    5 |    1 |
            +------+------+------+------+
            

            SQL:

            SELECT c0
            	, ROUND(c1 / sqrt((SELECT SUM(POW(c1, 2)) FROM tes_1)), 2) AS hasil_c1 
            	, ROUND(c2 / sqrt((SELECT SUM(POW(c2, 2)) FROM tes_1)), 2) AS hasil_c2
            	, ROUND(c3 / sqrt((SELECT SUM(POW(c3, 2)) FROM tes_1)), 2) AS hasil_c3
            FROM tabel
            UNION ALL
            SELECT "SUM"
            	, SUM(ROUND(c1 / sqrt((SELECT SUM(POW(c1, 2)) FROM tes_1)), 2)) AS total_c1
            	, SUM(ROUND(c2 / sqrt((SELECT SUM(POW(c2, 2)) FROM tes_1)), 2)) AS total_c2
            	, SUM(ROUND(c3 / sqrt((SELECT SUM(POW(c3, 2)) FROM tes_1)), 2)) AS total_c2
            FROM tabel

            Hasil:

            +------+----------+----------+----------+
            | c0   | hasil_c1 | hasil_c2 | hasil_c3 |
            +------+----------+----------+----------+
            | a1   |     0.49 |     0.48 |     0.13 |
            | a2   |     0.49 |     0.48 |     0.64 |
            | a3   |     0.49 |     0.48 |     0.64 |
            | a4   |     0.16 |     0.29 |     0.38 |
            | a5   |     0.49 |     0.48 |     0.13 |
            | SUM  |     2.12 |     2.21 |     1.92 |
            +------+----------+----------+----------+
            

            Yang lainnya dilanjutkan sendiri dulu ya mas….

      • pak agus mohon contohnya untuk pnerapan ke php,,krna saya coba coding ini

        $crsum = mysql_query("SELECT
        	  ROUND(c1 / sqrt((SELECT SUM(POW(c1, 2)) FROM nilaicpj)), 2) AS hasil_c1 
        	, ROUND(c2 / sqrt((SELECT SUM(POW(c2, 2)) FROM nilaicpj)), 2) AS hasil_c2
        	, ROUND(c3 / sqrt((SELECT SUM(POW(c3, 2)) FROM nilaicpj)), 2) AS hasil_c3
        FROM nilaicpj
        UNION ALL
        SELECT 
        	  SUM(ROUND(c1 / sqrt((SELECT SUM(POW(c1, 2)) FROM nilaicpj)), 2)) AS total_c1
        	, SUM(ROUND(c2 / sqrt((SELECT SUM(POW(c2, 2)) FROM nilaicpj)), 2)) AS total_c2
        	, SUM(ROUND(c3 / sqrt((SELECT SUM(POW(c3, 2)) FROM nilaicpj)), 2)) AS total_c2
        FROM nilaicpj");
        	$sum = mysql_fetch_array($crsum);
        
        ketika saya panggil $sum['hasil_c1'] hasilnya malah gini
        +------+----------+-
        | c0   | hasil_c1 |
        +------+----------+-----
        | a1   |     0.49 |    
        | a2   |     0.49 |   
        | a3   |     0.49 |  
        | a4   |     0.49 |  
        | a5   |     0.49 |   
        | SUM  |     0    |   
        +------+----------+---
        

        semua datanya sama,,padahal harusnya baris a4 itu 0.16
        dan ketika saya panggil $sum[‘total_c1’] malah gakmuncul pak,,

        • Disaya sudah benar mas:

          <?php
          $conn = mysqli_connect('localhost', 'root', '', 'tutorial_web');
          $crsum = mysqli_query($conn, "SELECT
          	c0,
          	  ROUND(c1 / sqrt((SELECT SUM(POW(c1, 2)) FROM nilaicpj)), 2) AS hasil_c1 
          	, ROUND(c2 / sqrt((SELECT SUM(POW(c2, 2)) FROM nilaicpj)), 2) AS hasil_c2
          	, ROUND(c3 / sqrt((SELECT SUM(POW(c3, 2)) FROM nilaicpj)), 2) AS hasil_c3
          FROM nilaicpj
          UNION ALL
          SELECT 
          	'SUM',
          	  SUM(ROUND(c1 / sqrt((SELECT SUM(POW(c1, 2)) FROM nilaicpj)), 2)) AS total_c1
          	, SUM(ROUND(c2 / sqrt((SELECT SUM(POW(c2, 2)) FROM nilaicpj)), 2)) AS total_c2
          	, SUM(ROUND(c3 / sqrt((SELECT SUM(POW(c3, 2)) FROM nilaicpj)), 2)) AS total_c2
          FROM nilaicpj");
          $sum = mysqli_fetch_all($crsum);
          echo '<pre>'; print_r($sum); die;
          ?>

          Hasil:

          Array
          (
              [0] => Array
                  (
                      [0] => a1
                      [1] => 0.49
                      [2] => 0.48
                      [3] => 0.13
                  )
          
              [1] => Array
                  (
                      [0] => a2
                      [1] => 0.49
                      [2] => 0.48
                      [3] => 0.64
                  )
          
              [2] => Array
                  (
                      [0] => a3
                      [1] => 0.49
                      [2] => 0.48
                      [3] => 0.64
                  )
          
              [3] => Array
                  (
                      [0] => a4
                      [1] => 0.16
                      [2] => 0.29
                      [3] => 0.38
                  )
          
              [4] => Array
                  (
                      [0] => a5
                      [1] => 0.49
                      [2] => 0.48
                      [3] => 0.13
                  )
          
              [5] => Array
                  (
                      [0] => SUM
                      [1] => 2.12
                      [2] => 2.21
                      [3] => 1.92
                  )
          
          )

          • ternyata susah ya pak kalau kurang update seperti saya ini,,sebelumnya terbiasa menggunakan mysql sekarang sudah mysqli,,dan bnyak fiturnya,,setelah saya ganti susunan source code saya ke mysqli jd bnyak yg error,,hadeeeh

          • Pakai mysql_query bisa mas, tergantung versi PHP nya…

            mysql_connect('localhost', 'root', '');
            mysql_select_db('tutorial_web');
            $crsum = mysql_query("SELECT
            	c0,
            	  ROUND(c1 / sqrt((SELECT SUM(POW(c1, 2)) FROM nilaicpj)), 2) AS hasil_c1 
            	, ROUND(c2 / sqrt((SELECT SUM(POW(c2, 2)) FROM nilaicpj)), 2) AS hasil_c2
            	, ROUND(c3 / sqrt((SELECT SUM(POW(c3, 2)) FROM nilaicpj)), 2) AS hasil_c3
            FROM nilaicpj
            UNION ALL
            SELECT 
            	'SUM',
            	  SUM(ROUND(c1 / sqrt((SELECT SUM(POW(c1, 2)) FROM nilaicpj)), 2)) AS total_c1
            	, SUM(ROUND(c2 / sqrt((SELECT SUM(POW(c2, 2)) FROM nilaicpj)), 2)) AS total_c2
            	, SUM(ROUND(c3 / sqrt((SELECT SUM(POW(c3, 2)) FROM nilaicpj)), 2)) AS total_c2
            FROM nilaicpj");
            while($row = mysql_fetch_assoc($crsum)) {
            	
            	$result[] = $row;
            }
            echo '<pre>'; print_r($result);

          • Pakai mysql_query bisa mas, tergantung versi PHP nya…

            mysql_connect('localhost', 'root', '');
            mysql_select_db('tutorial_web');
            $crsum = mysql_query("SELECT
            	c0,
            	  ROUND(c1 / sqrt((SELECT SUM(POW(c1, 2)) FROM nilaicpj)), 2) AS hasil_c1 
            	, ROUND(c2 / sqrt((SELECT SUM(POW(c2, 2)) FROM nilaicpj)), 2) AS hasil_c2
            	, ROUND(c3 / sqrt((SELECT SUM(POW(c3, 2)) FROM nilaicpj)), 2) AS hasil_c3
            FROM nilaicpj
            UNION ALL
            SELECT 
            	'SUM',
            	  SUM(ROUND(c1 / sqrt((SELECT SUM(POW(c1, 2)) FROM nilaicpj)), 2)) AS total_c1
            	, SUM(ROUND(c2 / sqrt((SELECT SUM(POW(c2, 2)) FROM nilaicpj)), 2)) AS total_c2
            	, SUM(ROUND(c3 / sqrt((SELECT SUM(POW(c3, 2)) FROM nilaicpj)), 2)) AS total_c2
            FROM nilaicpj");
            while($row = mysql_fetch_assoc($crsum)) {
            	
            	$result[] = $row;
            }
            echo '<pre>'; print_r($result);

  • makasih ya bapak pencerahannya,, mohon maklum kalau saya banyak tanya,masih awam dalam dunia mysql dan website, moga amal bapak dibalas oleh allah,,,terimakasih bapak agus,, jangan bosan2 menjawab pertanyaan saya ya bapak,,hehe

  • Selamat siang pak
    Saya mau tanya gimana ya caranya agar bisa menambahkan point menggunakan RFID. jadi setiap ditag kartunya maka point akan bertambah
    Terima kasih

  • mas saya mau tanya jadi saya rencananya fasilitas cetak yang dimana sesuai angsuran

    misal total angsuran 400
    pilih menu cetak angsuran 1 maka hasilnya (total angsuran-angsuran1)400-100 =300
    pilih menu cetak angsuran 2 maka hasilnya (total angsuran-(angsuran1+angsuran2))400-100-100=200

    tabel uang_pangkal ==>untuk menentukan jenis angsuran
    nis||nama_angsuran||jumlah bayar
    111 ||angsuran_1||100
    111||angsuran_2||100

    tabel_siswa ==>untuk menentukan nominal tanggungan angsuran
    nis||up||us||
    111||200||200

    • Coba pakai WHERE mas:
      Jika angsuran 1:
      ambil data dari database: SELECT jumlah_bayar FROM uang_pangkal WHERE nama_angsuran = angsuran_1
      Setelah itu kurangkan 400 dengan hasil tersebut.

      Untuk angsuran 2:
      ambil data dari database: SELECT jumlah_bayar FROM uang_pangkal WHERE nama_angsuran = angsuran_1 OR nama_angsuran = angsuran_2
      Setelah itu kurangkan 400 dengan hasil tersebut.

  • Assalamualaikum
    Mas saya mau nanya tentang MySql misal saya mempunyai 2 tabel

    t_barang 
    kdbarang | nama        | harga|stok|
    A101     | Pensil      | 5000 | 20 |
    A102     | Pulpen      |3000  | 20 |
    A103     |Penghapus    |2000  | 20 |
    
    t_penjualan
    nota|tgl_penjualan  |terjual|kdbarang|
    101 |2017-07-05     |10     |A102  |
    102 |2017-07-05     |5      |A101  |
    103 |2017-07-05     |5      |A103  |
    104 |2017-07-06     |5      |A102  |
    105 |2017-07-06     |5      |A101  |
    106 |2017-07-07     |5      |A102  |
    107 |2017-07-07     |10     |A103  |
    

    disini saya mau menanyakan bagaimana menjumlahkan misal stok-terjual dan harga*terjual menjadi kolom baru dan bagaimana ketika dijumlahkan menjadi satu misal pensil Total 100.000 penghapus total 50.000 tanpa berurutan kebawah satu-satu terimakasih

Silakan tinggalkan komentar

*

Like Us

Dapatkan update artikel terbaru via E-Mail
  1. Query MySQL di Dalam PHP Loop – Bad Practice !!!

  2. Software Kompres dan Optimasi Gambar / Foto (JPG dan PNG) – Tested

  3. 40+ Theme WordPress Gratis Untuk Blog – Modern & Responsive

  4. Eksklusif Cheat Sheet PHP Bahasa Indonesia – Pendamping Belajar PHP

  5. PHP FORM III: Menampilkan Data MySQL Dengan PHP dan Form HTML

  6. Tutorial PHP Form II: Menampilkan Hasil Input Form HTML dengan PHP

  7. Tutorial PHP Form I: Menghubungkan Form HTML dengan PHP

  8. Menampilkan Data Dari Beberapa Tabel MySQL – JOIN Pada MYSQL

  9. Memahami dan Menampilkan Tanggal dan Waktu Pada PHP

  10. Menghitung Selisih Waktu Dengan PHP – Cara Termudah