Pada kesempatan ini, kita akan membahas bagaimana cara membuat pivot table dengan MySQL.
Pivot tabel yang dimaksud disini sama seperti ketika kita membuat pivot table dengan Microsoft Excel, dimana kita membuat sumary dari suatu data dengan mengubah baris menjadi kolom.
Pada MySQL, kita tidak dapat langsung membuat pivot tabel seperti pada database lain yang memiliki fungsi PIVOT, melainkan kita harus mendefinisikan kolom satu per satu.
Hal ini sejalan dengan konsep bahwa SQL bukan bahasa dinamis yang bisa melakukan fungsi perulangan seperti bahasa pemrograman umumnya, melainkan bahasa statis dan tetap, sehingga dalam menuliskan query kita harus menulis secara manual.
Namun demikian untuk data dinamis, kita tetap dapat membuat query secara otomatis, namun perlu “jalan memutar” alias jalan tidak langsung, pembahasan tentang topik ini cukup panjang, sehingga perlu pembahasan tersendiri.
I. Persiapan DATA
Baiklah, langsung saja, untuk dapat membuat pivot tabel dengan MySQL, tentu kita perlu suatu data, agar lebih mudah, kali ini kita akan menggunakan satu tabel saja yaitu tabel tabel_sales
Tabel tersebut terdiri dari 5 kolom yaitu, id_trx
, nama
, tgl_trx
, tim
, dan nilai_trx
. Isi dari tabel tersebut tampak seperti tabel berikut:
id_trx | nama | tgl_trx | tim | nilai_trx |
---|---|---|---|---|
1 | Alfa | 2016-01-10 | 1 | 250000 |
2 | Charlie | 2016-01-02 | 2 | 175000 |
3 | Bravo | 2016-01-01 | 1 | 310000 |
4 | Bravo | 2016-02-04 | 1 | 250000 |
5 | Alfa | 2016-01-15 | 1 | 300000 |
6 | Charlie | 2016-01-13 | 2 | 325000 |
7 | Bravo | 2016-02-07 | 1 | 275000 |
8 | Bravo | 2016-03-06 | 1 | 150000 |
9 | Alfa | 2016-02-05 | 1 | 215000 |
10 | Alfa | 2016-02-22 | 1 | 350000 |
11 | Alfa | 2016-02-02 | 1 | 450000 |
12 | Alfa | 2016-03-12 | 1 | 150000 |
13 | Alfa | 2016-03-17 | 1 | 225000 |
14 | Bravo | 2016-03-11 | 1 | 150000 |
15 | Bravo | 2016-03-18 | 1 | 150000 |
16 | Charlie | 2016-01-23 | 2 | 350000 |
17 | Charlie | 2016-02-22 | 2 | 300000 |
18 | Charlie | 2016-03-21 | 2 | 275000 |
19 | Charlie | 2016-03-12 | 2 | 450000 |
20 | Delta | 2016-02-11 | 2 | 450000 |
21 | Delta | 2016-02-17 | 2 | 550000 |
22 | Delta | 2016-03-11 | 2 | 370000 |
Tabel diatas sudah cukup informatif, namun masih dapat dibuat lebih informatif lagi, terutama ketika membandingkan data secara horizontal.
II. Pivot Table Dengan MySQL
Pada pivot table kali ini, kita akan menampilkan data penjualan per bulan per nama petugas. Adapun query yang kita perlukan adalah sebagai berikut:
SELECT nama,
SUM( IF( MONTH(tgl_trx) = 1, nilai_trx, 0) ) AS januari,
SUM( IF( MONTH(tgl_trx) = 2, nilai_trx, 0) ) AS februari,
SUM( IF( MONTH(tgl_trx) = 3, nilai_trx, 0) ) AS maret,
SUM( nilai_trx ) AS total_trx
FROM tabel_sales
GROUP BY nama
Hasil yang kita peroleh adalah:
+---------+---------+----------+--------+-----------+ | nama | januari | februari | maret | total_trx | +---------+---------+----------+--------+-----------+ | Alfa | 550000 | 1015000 | 375000 | 1940000 | | Bravo | 310000 | 525000 | 450000 | 1285000 | | Charlie | 850000 | 300000 | 725000 | 1875000 | | Delta | 0 | 1000000 | 370000 | 1370000 | +---------+---------+----------+--------+-----------+
Tabel yang dihasilkan jauh lebih informatif dibanding dengan tabel aslinya, kita dapat membandingkan dengan mudah data penjualan per bulan.
Pada query diatas kita menggunakan fungsi SUM untuk menjumlahkan data per kolom, lebih jauh tentang fungsi ini dapat dibaca pada artikel: Menggunakan SUM IF untuk menjumlahkan nilai field/kolom suatu Tabel pada MySQL
Selain itu, kita juga menggunakan fungsi MONTH
untuk mengambil data bulan pada kolom tgl_trx
, jika hasil yang diperoleh angka 1, maka kita masukkan ke kolom januari, jika 2 ke februari, dan jika 3 ke kolom maret, selanjutnya kita gunakan fungsi SUM(nilai_trx)
untuk membuat kolom total.
Melengkapi Tampilan Data
Agar lebih informatif, mari kita tambahkan data jumlah transaksi. Kita ubah query menjadi seperti ini:
SELECT
nama,
SUM( IF( MONTH(tgl_trx) = 1, nilai_trx, 0) ) AS januari,
COUNT( IF( MONTH(tgl_trx) = 1, id_trx, NULL) ) AS trx_1,
SUM( IF( MONTH(tgl_trx) = 2, nilai_trx, 0) ) AS februari,
COUNT( IF( MONTH(tgl_trx) = 2, nilai_trx, NULL) ) AS trx_2,
SUM( IF( MONTH(tgl_trx) = 3, nilai_trx, 0) ) AS maret,
COUNT( IF( MONTH(tgl_trx) = 3, nilai_trx, NULL) ) AS trx_3,
COUNT(id_trx) AS jml_trx,
SUM( nilai_trx ) AS total_trx
FROM tabel_sales
GROUP BY nama
Hasil yang kita peroleh:
+---------+---------+-------+----------+-------+--------+-------+---------+-----------+ | nama | januari | trx_1 | februari | trx_2 | maret | trx_3 | jml_trx | total_trx | +---------+---------+-------+----------+-------+--------+-------+---------+-----------+ | Alfa | 550000 | 2 | 1015000 | 3 | 375000 | 2 | 7 | 1940000 | | Bravo | 310000 | 1 | 525000 | 2 | 450000 | 3 | 6 | 1285000 | | Charlie | 850000 | 3 | 300000 | 1 | 725000 | 2 | 6 | 1875000 | | Delta | 0 | 0 | 1000000 | 2 | 370000 | 1 | 3 | 1370000 | +---------+---------+-------+----------+-------+--------+-------+---------+-----------+
Pada query diatas, saya sengaja menambahkan baris kosong agar query lebih mudah dibaca.
Pada query diatas kita menggunakan fungsi COUNT
untuk menghitung jumlah baris lebih jauh tentang fungsi ini dapat dibaca pada artikel: Menghitung Field/Kolom Pada Tabel MySQL Dengan Kondisi Tertentu Menggunakan COUNT IF
Perhatikan bahwa pada fungsi COUNT
, seperti pada COUNT(IF(MONTH(tgl_trx) = 1, id_trx, NULL)) AS trx_1
), kita menggunakan NULL
, bukan angka 0
seperti yang kita gunakan pada fungsi SUM
Hal tersebut disebabkan karena fungsi COUNT
juga akan menghitung baris dengan nilai 0
, sehingga hasil yang kita peroleh menjadi tidak akurat, agar tidak ikut dihitung, kita gunakan nilai NULL
III. Pivot Table Dengan MySQL – Menambahkan Baris Total Dengan WITH ROLLUP
Tabel diatas masih belum lengkap karena belum ada data total nilai transaksi per bulannya, untuk itu mari kita buat baris baru yang berisi total penjualan per bulan, jalankan query berikut:
SELECT IFNULL(nama, 'TOTAL') AS nama_sales,
SUM( IF( MONTH(tgl_trx) = 1, nilai_trx, 0) ) AS januari,
SUM( IF( MONTH(tgl_trx) = 2, nilai_trx, 0) ) AS februari,
SUM( IF( MONTH(tgl_trx) = 3, nilai_trx, 0) ) AS maret,
COUNT(id_trx) AS jml_trx,
SUM( nilai_trx ) AS total_trx
FROM tabel_sales
GROUP BY nama
WITh ROLLUP
Hasil yang kita peroleh adalah:
+------------+---------+----------+---------+---------+-----------+ | nama_sales | januari | februari | maret | jml_trx | total_trx | +------------+---------+----------+---------+---------+-----------+ | Alfa | 550000 | 1015000 | 375000 | 7 | 1940000 | | Bravo | 310000 | 525000 | 450000 | 6 | 1285000 | | Charlie | 850000 | 300000 | 725000 | 6 | 1875000 | | Delta | 0 | 1000000 | 370000 | 3 | 1370000 | | TOTAL | 1710000 | 2840000 | 1920000 | 22 | 6470000 | +------------+---------+----------+---------+---------+-----------+
Pada contoh diatas, terdapat tambahan baris baru yaitu baris TOTAL, sehingga sekarang kita sudah dapat membandingkan total penjualan perbulan.
Pada query diatas, klausa WITH ROLLUP
akan menambahkan sebuah baris baru, baris tersebut akan menjumlahkan kolom yang ada fungsi agregatnya, yaitu kolom januari
, februari
, maret
, jml_trx
, dan total_trx
. Kolom jml_trx
terdapat fungsi COUNT
, sedangkan yang lain fungsi SUM
Selanjutnya, pada baris baru tersebut, MySQL akan memberikan nilai NULL
pada kolom yang ada pada klausa GROUP BY
, yang pada contoh diatas, kolom nama_sales.
Agar lebih bermakna, nilai NULL
tersebut kita ganti dengan kata TOTAL, untuk itu kita gunakan fungsi IFNULL
yaitu pada IFNULL(nama, 'TOTAL') AS nama_sales
, yang artinya jika kolom bernilai NULL
, maka ganti dengan kata TOTAL.
Menambahkan Baris Subtotal Pada Pivot Table
Selanjutnya pada kondisi tertentu kita perlu untuk menampilkan data subtotal. Terkait contoh diatas, kita akan membuat subtotal berdasarkan tim, sehingga diketahui kinerja dari masing-masing tim.
Query yang kita perlukan adalah:
SELECT
IFNULL( nama, 'SUB TOTAL' ) AS nama_sales,
IFNULL( tim, 'TOTAL' ) AS sales_tim,
SUM( IF( MONTH(tgl_trx) = 1, nilai_trx, 0) ) AS januari,
COUNT( IF( MONTH(tgl_trx) = 1, id_trx, NULL) ) AS trx_1,
SUM( IF( MONTH(tgl_trx) = 2, nilai_trx, 0) ) AS februari,
COUNT( IF( MONTH(tgl_trx) = 2, nilai_trx, NULL) ) AS trx_2,
SUM( IF( MONTH(tgl_trx) = 3, nilai_trx, 0) ) AS maret,
COUNT( IF( MONTH(tgl_trx) = 3, nilai_trx, NULL) ) AS trx_3,
COUNT(id_trx) AS jml_trx,
SUM( nilai_trx ) AS total_trx
FROM tabel_sales
GROUP BY tim, nama
WITH ROLLUP
Hasil yang kita peroleh adalah:
+------------+-----------+---------+-------+----------+-------+---------+-------+---------+-----------+ | nama_sales | sales_tim | januari | trx_1 | februari | trx_2 | maret | trx_3 | jml_trx | total_trx | +------------+-----------+---------+-------+----------+-------+---------+-------+---------+-----------+ | Alfa | 1 | 550000 | 2 | 1015000 | 3 | 375000 | 2 | 7 | 1940000 | | Bravo | 1 | 310000 | 1 | 525000 | 2 | 450000 | 3 | 6 | 1285000 | | SUB TOTAL | 1 | 860000 | 3 | 1540000 | 5 | 825000 | 5 | 13 | 3225000 | | Charlie | 2 | 850000 | 3 | 300000 | 1 | 725000 | 2 | 6 | 1875000 | | Delta | 2 | 0 | 0 | 1000000 | 2 | 370000 | 1 | 3 | 1370000 | | SUB TOTAL | 2 | 850000 | 3 | 1300000 | 3 | 1095000 | 3 | 9 | 3245000 | | SUB TOTAL | TOTAL | 1710000 | 6 | 2840000 | 8 | 1920000 | 8 | 22 | 6470000 | +------------+-----------+---------+-------+----------+-------+---------+-------+---------+-----------+
Perhatikan bahwa sekarang muncul baris baru dengan nama SUB TOTAL, baris baru ini mucul karena kita menambahkan kolom tim pada klausa GROUP BY
, sehingga ketika klausa WITH ROLLUP
dijalankan, MySQL akan menghitung subtotal berdasarkan kolom tim + nama.
Mengubah Urutan Data Pivot Table
Jika kita perhatikan, setiap data yang dihasilkan oleh klausa GROUP BY
, akan ditampilkan dengan rapi, urut mulai dari nilai yang terkecil ke nilai yang terbesar.
Misal pada contoh sebelumnya, data pada kolom nama_sales
diurutkan berdasarkan abjad terkecil ke terbesar, demikian juga dengan kolom tim.
Kenapa demikian? hal ini disebabkan karena ketika menjalankan klausa GROUP BY
, MySQL akan sekaligus mengurutkan data secara ascending (urut dari terkecil ke terbesar) yang sering disebut implisit order.
Kita dapat mengubah pola pengurutan tersebut dengan menambahkan ASC
atau DESC
pada klausa GROUP BY
. Misal kita ubah urutan nama dan tim menjadi descending.
Jalankan query berikut:
SELECT
IFNULL( nama, 'SUB TOTAL' ) AS nama_sales,
IFNULL( tim, 'TOTAL' ) AS sales_tim,
SUM( IF( MONTH(tgl_trx) = 1, nilai_trx, 0) ) AS januari,
COUNT( IF( MONTH(tgl_trx) = 1, id_trx, NULL) ) AS trx_1,
SUM( IF( MONTH(tgl_trx) = 2, nilai_trx, 0) ) AS februari,
COUNT( IF( MONTH(tgl_trx) = 2, nilai_trx, NULL) ) AS trx_2,
SUM( IF( MONTH(tgl_trx) = 3, nilai_trx, 0) ) AS maret,
COUNT( IF( MONTH(tgl_trx) = 3, nilai_trx, NULL) ) AS trx_3,
COUNT(id_trx) AS jml_trx,
SUM( nilai_trx ) AS total_trx
FROM tabel_sales
GROUP BY tim DESC, nama DESC
WITH ROLLUP
Hasil yang kita peroleh:
+------------+-----------+---------+-------+----------+-------+---------+-------+---------+-----------+ | nama_sales | sales_tim | januari | trx_1 | februari | trx_2 | maret | trx_3 | jml_trx | total_trx | +------------+-----------+---------+-------+----------+-------+---------+-------+---------+-----------+ | Delta | 2 | 0 | 0 | 1000000 | 2 | 370000 | 1 | 3 | 1370000 | | Charlie | 2 | 850000 | 3 | 300000 | 1 | 725000 | 2 | 6 | 1875000 | | SUB TOTAL | 2 | 850000 | 3 | 1300000 | 3 | 1095000 | 3 | 9 | 3245000 | | Bravo | 1 | 310000 | 1 | 525000 | 2 | 450000 | 3 | 6 | 1285000 | | Alfa | 1 | 550000 | 2 | 1015000 | 3 | 375000 | 2 | 7 | 1940000 | | SUB TOTAL | 1 | 860000 | 3 | 1540000 | 5 | 825000 | 5 | 13 | 3225000 | | SUB TOTAL | TOTAL | 1710000 | 6 | 2840000 | 8 | 1920000 | 8 | 22 | 6470000 | +------------+-----------+---------+-------+----------+-------+---------+-------+---------+-----------+
Pada tabel diatas, data nama_sales dan sales_tim diurutkan secara descending.
Cara ini merupakan cara yang paling mudah untuk mengubah urutan data, namun, pada MySQL versi 5.7, fitur ini sudah deprecated, artinya tidak disarankan untuk digunakan, karena, kedepan fitur ini akan dihapus.
Untuk itu disarankan untuk menggunakan eksplisit order dengan menggunakan klausa ORDER BY
. Pada query yang mengandung klausa WITH ROLLUP
, penggunaan klausa ORDER BY
ini tidaklah mudah.
Hal ini karena kita harus mengatur nama dari kolom hasil klausa WITH ROLLUP
sedemikian rupa sehingga berada di urutan paling bawah, perhatikan contoh berikut:
SELECT * FROM
(
SELECT
IFNULL( nama, '1 - SUB TOTAL' ) AS nama_sales,
IFNULL( tim, '0 - TOTAL' ) AS sales_tim,
SUM( IF( MONTH(tgl_trx) = 1, nilai_trx, 0) ) AS januari,
COUNT( IF( MONTH(tgl_trx) = 1, id_trx, NULL) ) AS trx_1,
SUM( IF( MONTH(tgl_trx) = 2, nilai_trx, 0) ) AS februari,
COUNT( IF( MONTH(tgl_trx) = 2, nilai_trx, NULL) ) AS trx_2,
SUM( IF( MONTH(tgl_trx) = 3, nilai_trx, 0) ) AS maret,
COUNT( IF( MONTH(tgl_trx) = 3, nilai_trx, NULL) ) AS trx_3,
COUNT(id_trx) AS jml_trx,
SUM( nilai_trx ) AS total_trx
FROM tabel_sales
GROUP BY tim, nama
WITH ROLLUP
) AS tabel_sales
ORDER BY sales_tim DESC, nama_sales DESC
Hasil yang kita peroleh:
+---------------+-----------+---------+-------+----------+-------+---------+-------+---------+-----------+ | nama_sales | sales_tim | januari | trx_1 | februari | trx_2 | maret | trx_3 | jml_trx | total_trx | +---------------+-----------+---------+-------+----------+-------+---------+-------+---------+-----------+ | Delta | 2 | 0 | 0 | 1000000 | 2 | 370000 | 1 | 3 | 1370000 | | Charlie | 2 | 850000 | 3 | 300000 | 1 | 725000 | 2 | 6 | 1875000 | | 1 - SUB TOTAL | 2 | 850000 | 3 | 1300000 | 3 | 1095000 | 3 | 9 | 3245000 | | Bravo | 1 | 310000 | 1 | 525000 | 2 | 450000 | 3 | 6 | 1285000 | | Alfa | 1 | 550000 | 2 | 1015000 | 3 | 375000 | 2 | 7 | 1940000 | | 1 - SUB TOTAL | 1 | 860000 | 3 | 1540000 | 5 | 825000 | 5 | 13 | 3225000 | | 1 - SUB TOTAL | 0 - TOTAL | 1710000 | 6 | 2840000 | 8 | 1920000 | 8 | 22 | 6470000 | +---------------+-----------+---------+-------+----------+-------+---------+-------+---------+-----------+
Pada query diatas, dengan subquery kita buat tabel sementara yang sama persis dengan contoh sebelumnya, baru kemudian hasilnya kita urutkan berdasarkan kolom sales_tim, dan sales_nama.
Perhatikan bahwa pada query diatas, pada SUB TOTAL saya beri awalan angka 1, sehingga jika diurutkan secara descending akan berada di bawah, demikian juga untuk TOTAL pada kolom sales_tim.
Pembahasan tentang membuat total dan subtotal hal ini cukup panjang, sobat dapat mempelajarinya lebih jauh pada artikel: Menghitung Total dan Subtotal Pada MySQL
IV. Pivot Table Dengan MySQL – Menambahkan Baris Total Dengan Query Tersendiri
Pada contoh sebelumnya, kita dapat dengan mudah menambahkan baris total dan subtotal dengan klausa WITH ROLLUP
, pada kondisi tertentu, kita tidak dapat mengandalkan klausa tersebut, misal ketika kita ingin menampilkan data berdasarkan kolom nilai_trx
yang diurutkan secara descending
Jika kita menggunakan klausa WITH ROLLUP
, maka baris TOTAL akan selalu berada diatas, karena pasti jumlahnya paling besar.
Untuk mengatasi hal tersebut, kita dapat menambahkan baris TOTAL dengan query tersendiri, kemudian dengan UNION ALL
, hasilnya kita gabung dengan query utama. Adapun querynya adalah:
SELECT * FROM (
SELECT
nama,
tim,
SUM( IF( MONTH(tgl_trx) = 1, nilai_trx, 0) ) AS januari,
COUNT( IF( MONTH(tgl_trx) = 1, id_trx, NULL) ) AS trx_1,
SUM( IF( MONTH(tgl_trx) = 2, nilai_trx, 0) ) AS februari,
COUNT( IF( MONTH(tgl_trx) = 2, nilai_trx, NULL) ) AS trx_2,
SUM( IF( MONTH(tgl_trx) = 3, nilai_trx, 0) ) AS maret,
COUNT( IF( MONTH(tgl_trx) = 3, nilai_trx, NULL) ) AS trx_3,
COUNT(id_trx) AS jml_trx,
SUM( nilai_trx ) AS total_trx
FROM tabel_sales
GROUP BY tim, nama
ORDER BY total_trx DESC
) AS tabel_sales
UNION ALL
SELECT 'TOTAL' AS nama, '' AS tim,
SUM( IF( MONTH(tgl_trx) = 1, nilai_trx, 0) ) AS januari,
COUNT( IF( MONTH(tgl_trx) = 1, id_trx, NULL) ) AS trx_1,
SUM( IF( MONTH(tgl_trx) = 2, nilai_trx, 0) ) AS februari,
COUNT( IF( MONTH(tgl_trx) = 2, nilai_trx, NULL) ) AS trx_2,
SUM( IF( MONTH(tgl_trx) = 3, nilai_trx, 0) ) AS maret,
COUNT( IF( MONTH(tgl_trx) = 3, nilai_trx, NULL) ) AS trx_3,
COUNT(id_trx) AS jml_trx,
SUM( nilai_trx ) AS total_trx
FROM tabel_sales
Hasil yang kita peroleh:
+---------+-----+---------+-------+----------+-------+---------+-------+---------+-----------+ | nama | tim | januari | trx_1 | februari | trx_2 | maret | trx_3 | jml_trx | total_trx | +---------+-----+---------+-------+----------+-------+---------+-------+---------+-----------+ | Alfa | 1 | 375000 | 2 | 815000 | 3 | 0 | 0 | 5 | 1190000 | | Delta | 2 | 0 | 0 | 1000000 | 2 | 0 | 0 | 2 | 1000000 | | Bravo | 1 | 310000 | 1 | 525000 | 2 | 0 | 0 | 3 | 835000 | | Charlie | 2 | 525000 | 2 | 300000 | 1 | 0 | 0 | 3 | 825000 | | TOTAL | | 1535000 | 6 | 2640000 | 8 | 2295000 | 8 | 22 | 6470000 | +---------+-----+---------+-------+----------+-------+---------+-------+---------+-----------+
Perhatikan bahwa pada query diatas, kita letakkan query pertama pada subquery, hal ini dikarenakan ketika menggunakan UNION ALL
, klausa ORDER BY
harus berada di paling bawah, sehingga untuk mengurutkan data yang pertama, kita gunakan subquery.
V. Pivot Table Dinamis Dengan MySQL
Pada pembahasan diatas, jumlah kolom hasil pivot table sudah kita tentukan sebelumnya (statis). Hal tersebut pada banyak kondisi sudah cukup memadahi, namun, pada kondisi tertentu, jumlah kolom pada hasil pivot table berubah ubah sesuai dengan jumlah baris.
Pada kondisi tersebut, maka query SQL nya juga ikut berubah ubah, sehingga penggunaan model statis tidak dapat digunakan lagi, untuk itu, kita dapat menggunakan model SQL yang dikenal dengan istilah pivot table dinamis. Pembahasan tentang hal ini dapat diikuti pada tutorial: Pivot Table Dinamis Dengan MySQL
VI. Penutup
Membuat pivot table dengan MySQL cukup mudah dilakukan, kendala utama dari proses ini adalah ketika ingin mengurutkan data yang didalamnya terdapat baris subtotal dan total yang dihasilkan oleh klausa WITH ROLLUP
.
Hal ini disebabkan karena baris total dan subtotal tersebut ikut diurutkan, sehingga sangat besar kemungkinan baris tersebut akan berada di baris paling atas, sebagai alternatif, kita dapat membuat baris total menggunakan query tersendiri.
Jika sobat ingin membuat pivot table menggunakan PHP, sobat dapat mengikuti tutorial: Pivot Table Dengan PHP dan MySQL
Demikian pembahasan mengenai pivot table dengan MySQL, semoga bermanfaat.
Subscibe Now
Suka dengan artikel di Jagowebdev.com? jangan sampai ketinggalan, segera join ke milis kami untuk update informasi terbaru dari Jagowebdev.com
38 Feedback dari pembaca
jika januari, febrari, maret nya itu dinamis gimana gan?
Berarti SQL nya bersifat dinamis ya mas. Karena SQL bukanlah bahasa dinamis (tidak mengenal perulangan) maka untuk membuat SQL dinamis, kita perlu menempuh beberapa langkah. Singkatnnya, query jadiya adalah sebagai berikut:
Untuk penjelasan lebih lengkap, dapat dibaca pada tutorial: Pivot Table Dinamis Dengan MySQL
Salam buat mas Agus. saya mau tanya kalau punya tabel seperti
Kalau pivot tabel MySQL yang hasilnya per Kecamatan seperti ini gimana?
Misalnya Kecamatan Bonai
Di Kecamatan Koja menjadi
Misalnya Kecamatan Koja
Coba pakai query ini mas:
Hasil:
Jika data bidang sifatnya dinamis, bisa digunakan teknik pivot table dinamis mas: Pivot Table Dinamis Dengan MySQL
salam mas agus..
saya punya problem yg sama seperti ini modelnya mempivot table di MySql, saya sudah mencoba buat querynya namun tidak berhasil.
saya mau mempivot dari view msv_inspeksi_x dan table image_temuan_inspeksi.
untuk view msv_inspeksi_x seperti ini tampilannya :
tampilannya disini berantakan mas jd ngga jelas gmn wujud tampilannya, karena panjang sekali datanya jd ngga muat dikolom komentar ini, mungkin bisa di copy paste ke notedpad tanpa format word wrap sekiranya bisa dilihat wujud tampilan viewnya hehehe..
dan table image_inspeksi_temuan seperti ini;
nah saya mau hasil query nya menjadi seperti ini ;
berantakan lagi tampilannya 😀 saya tidak bisa merapikannya dikolom komentar ini, mohon bantuannya mas..
semoga berkenan.. terimakasih..
Untuk code panjang bisa menggunakan tag <pre> mbak. Untuk kasus diatas, coba gunakan JOIN mbak:
tidak bisa di jalankan mas query nya, nama kolom before dan after di baca fungsi mas jadi saya ganti isi valuenya menjadi sebelum dan sesudah, namun ketika di jalankan dengan query seperti ini:
muncul error seperti ini mas:
Unknown column ‘sebelum’ in ‘field list’
kolom sebelum tidak di kenali mas..
Coba tetap menggunakan before dan after tetapi menggunakan backtick mbak:
Error: Unknown column ‘sebelum’ in ‘field list’ berarti kolom sebelum tidak ditemukan, bisa jadi kolom tersebut di tabel image_inspeksi_temuan tidak ada
mau nanya mas, saya punya contoh data seperti ini
pengen jdi seperti ini gan:
Untuk model seperti itu, setahu saya perlu menggunakan bahasa pemrograman struktural mas, seperti php, karena untuk memunculkan total, tidak bisa menggunakan WITH ROLLUP, karena tidak ada data yang di group
Permisi mas agus saya punya masalah pada saat run prepare stmt from @sql
mohon dicek sql saya:
Pesan errornya seperti apa ya mas?
mas saya mau tanya untuk query yang ini, kan munculnya hanya nama” bulanya,
pertanyaanya, bagaimana kita bisa tahu bedanya kalo itu tahun misalnya 2017 atau 2018..?
terimakasih mas mohon bantuanya
SELECT nama,
SUM( IF( MONTH(tgl_trx) = 1, nilai_trx, 0) ) AS januari,
SUM( IF( MONTH(tgl_trx) = 2, nilai_trx, 0) ) AS februari,
SUM( IF( MONTH(tgl_trx) = 3, nilai_trx, 0) ) AS maret,
SUM( nilai_trx ) AS total_trx
FROM tabel_sales
GROUP BY nama
Oiya mas, maaf, karena dicontoh datanya hanya satu tahun. untuk mengambil hanya satu tahun, bisa ditambahkan klausa WHERE mas, misal:
makasih mah bisa,, smoga ilmunya bermanfaat bg yg lainya..
saya blh nanya yg lainya gk mas di email tentang mslh yg inii?
Iya mas, silakan kirim email ke saya…
Selamat pagi mas agus, mohon bantuanya saya punya tabel seperti ini hasil dari relasi 3 tabel, tbl_nilai, tbl_vendor dan tbl_kriteria
Hasil dari query SELECT nilai.id_nilai, nilai.id_vendor, nilai.id_kriteria, nilai.nilai, vendor.id_vendor, vendor.nama_vendor, kriteria.id_kriteria, kriteria.nama_kriteria, kriteria.kode FROM nilai JOIN vendor ON nilai.id_vendor = vendor.id_vendor JOIN kriteria ON kriteria.id_kriteria = nilai.id_kriteria
saya mau tanya kalau pivot tabel MySQL yang saya mau tampilkan per nama kriteria seperti ini gimana ya?
Misalnya seperti ini :
Tetapi data dari kolom kriterianya dan nilai dijadikan kolom tersendiri urutaanya nanti berdasarkan nama vendor, kira” gimana ya mas query-nya?.. mohon bantuanya
Terimakasih.
Itu tabel dibawah sudah sama dengan tabel diatas mas….
Selamat Malam Mas..
saya mau minta tolong kalo tampilannya jadi gini gimana yas..
+————————————————+——+——+——-+—–+——-+
| nama_vendor | C1 | C2 | C3 | C4 | C5 |
+————————————————+——+——+——-+—–+——-+
| PT. MITRA CAHAYA MUKTI | 2 | 2 | 3 | 3 | 3 |
| PT. POLYLINE TECHNOLOGIES | 4 | 3 | 2 | 2 | 3 |
| PT. KARYA ENERGI INDONESIA | 3 | 3 | 3 | 3 | 3 |
+————————————————+——+——+——+——+——-+
terus satu lagi kalo II. Pivot Table Dengan MySQL tidak menggunakan sum gimana ya? jadi semua data tampil tapi tidak di sum.
terimakasih sebelumnya…
Coba pake ini mas:
SELECT nama_vendor, SUM(kolom) AS C1, SUM(kolom2) AS C2, SUM(kolom3) AS C3
FROM tabel
WHERE …
Kalau ditampilkan semua tinggal di query apa adanya saja mas:
SELECT kolom FROM tabel
Coba dibaca artikel: PHP FORM III: Menampilkan Data MySQL Dengan PHP dan Form HTML
Hallo mas, Selamat pagi mas agus.
Mohon pencerahannya saya punya 2 table. 1: table_sdm
+â€â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+
| id | nama_sdm | jabatan |
+â€â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+
| 1 | AGUS PURWANTO | DIRUT |
| 2 | ANDI SUBAGIO | BENDAHARA |
+â€â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+
dan table 2: table_absensi_sdm
+â€â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+
| id | id_sdm | tgl_absen | jns_kehadiran | waktu_datang | waktu_pulang |
+â€â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+
| 1 | 1 | 2020-03-01 | HADIR | 08:00 | 17:00 |
| 1 | 2 | 2020-03-01 | IZIN | 08:00 | 17:00 |
| 1 | 1 | 2020-03-02 | HADIR | 08:00 | 17:00 |
| 1 | 2 | 2020-03-02 | HADIR | 08:00 | 17:00 |
| 1 | 1 | 2020-03-03 | IZIN | 08:00 | 17:00 |
+â€â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+
Lalu saya ingin membuat ouput seperti ini (satu, dua, tiga, Dst.. itu adalah Tgl tiap bulannya):
+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+
| nama_sdm | satu | dua | tiga | empat | lima | Dst… |
+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+
| AGUS PURWANTO | HADIR | HADIR | IZIN | null | null | null |
| ANDI SUBAGIO | IZIN | HADIR | null | null | null | null |
+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+â€â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€Ã¢â‚¬â€+
Mohon penjelasan.a mas agus saya mentok disini mas.
Terimakasih sebelumnya…
Itu di tabel hasil, kriteria satu dua tiga empat apa mas?
Assalamu’alaikum pak mau bertanya, kalau untuk operasi soal “Karyawan yang melayani pelanggan lebih dari 10 akan mendapat bonus gaji sebanyak 10000 dikali kelebihan jumlah pelanggan. Buat query untuk menpilkan bonus gaji yang diterima oleh karyawan
Tergantung struktur tabelnya seperti apa mas…
selamat pagi mas agus.
mohon maaf mau tanya saya punya table spt ini
_____________________________________
|id | meta _key | meta_value |
______________________________________|
|1 | 23 | AMMAR |
|2 | 24 | SURABAYA |
|3 | 25 | LAKI-LAKI |
|4 | 26 | KAWIN |
|5 | 27 | WIRASWASTA |
|6 |28 | Jl. RAYA DARMO |
ingin dijadikan spt ini
_______________________________________________________________________________________________________________
NAMA ALAMAT KELAMIN STATUS PEKERJAAN TMP BEKERJA
_______________________________________________________________________________________________________________
AMMAR SURABAYA LAKI-LAKI KAWIN WIRASWASTA JL. RAYA DARMO
mohon bantuannya mas
di phpmysql
Tabel nya cuman satu itu mas? kalau seperti itu hanya bisa dilihat dari kolom meta_key nya saja, misal:
Maaf Pak , ini semua di eksekusi di database phpmyadmin, tidak ada yg di teks editor ?
Bisa disesuaikan mas, yang penting bentuk query SQL nya
Selamat Sore Pak Agus,
Mohon bantuannya,
saya coba buat tabel absensi, isinya:
nama | tanggal_absen | jam_masuk | jam_keluar
fulan | 2021-04-01 | 08:00 | 16:00
kary1 | 2021-04-01| 08:05 | 17:00
bagaimana menampilkan data lewat PHP, bila header tabelnya adalah:
nama | 1 | 2 | 3 | dst (dinamis, sesuai tanggal bulan berjalan)
| M | P | M | P | dst (dinamis, sesuai data)
fulan | 08:00 | 16:00 | dst (dinamis, sesuai data)
kary1 | 08:05 | 17:00 |
terima kasih atas bantuannya.
Siang mas, bisa dicoba menggunakan loop start nya 1 kemudian jumlahnya sebanyak hari dibulan yang dipilih. Untuk jumlah harinya bisa menggunakan fungsi cal_days_in_month() bisa dibaca di https://www.php.net/manual/en/function.cal-days-in-month.php
Misal:
Siang mas minta tolong
saya ada tabel sbb:
+———————–+——–+
| Scan_date(Timestamp) | pin
+———————–+——–+
| 2021-06-03 06:36:10 | 1230
| 2021-06-03 14:37:54 | 1230
| 2021-06-04 13:47:26 | 1230
| 2021-06-04 21:09:27 | 1230
| 2021-06-07 08:59:04 | 1230
| 2021-06-07 09:03:04 | 1230
| 2021-06-07 16:02:02 | 1230
ingin outputnya seperti ini
+——-+———————+———————+————–+
| pin | Scan1 | Scan2 | Scan3
+——-+———————+———————+————–+
| 1230 | 2021-06-03 06:36:10 | 2021-06-03 14:37:54 |
| 1230 | 2021-06-04 13:47:26 | 2021-06-04 21:09:27 |
| 1230 | 2021-06-05 00:00:00 | 2021-06-05 00:00:00 |
| 1230 | 2021-06-06 00:00:00 | 2021-06-06 00:00:00 |
| 1230 | 2021-06-07 08:59:04 | 2021-06-07 09:03:04 | 2021-06-07 16:02:02
bagaimana ya?
Itu tidak bisa dilakukang menggunakan SQL mas, coba di query biasa kemudian hasilnya diloop menggunakan PHP untuk mendapatkan layout diatas
Siang Mas Agus, mohon infonya untuk mendapatkan nilai atau hasil seperti dibawah ini :
————————————————-
ID | DETAIL | XDETAIL
1 | A | B,C,D
————————————————-
dari nilai yang sebelumnya adalah :
ID | DETAIL
1 | A
1 | B
1 | C
1 | D
2 | X
2 | Y
Bisa dicoba menggunakan GROUP_CONCAT mas
Assalamualaikum, pak Agus. Gimana kabar?
Saya mau tanya. saya mempunyai data seperti berikut.
+——–+——-+————+———-+
| idcard | inout | tgl | waktu |
+——–+——-+————+———-+
| 61 | 0 | 2020-09-26 | 06:50:09 |
| 27 | 0 | 2020-09-26 | 07:44:47 |
| 61 | 1 | 2020-09-26 | 13:06:36 |
| 27 | 1 | 2020-09-26 | 15:07:39 |
| 27 | 1 | 2020-09-26 | 15:12:56 |
+——–+——-+————+———-+
jadinya seperti ini:
| idcard | tgl | in | out |
| 61 | 2020-09-26 | 06:50:09 | 13:06:36 |
| 27 | 2020-09-26 | 07:44:47 | 15:12:56 |
0 = in, dan ambil yang paling kecil
1 = out, dan ambil yang paling besar
Terimakasih
Coba mas
Siang mas minta tolong
Saya ada 2 tabel berikut. ingin hasil tabel sesuai yg paling bawah, mohon bantuanya
DB : Unit
|———————————————————————————-|
| id | Supir | No Pol | samarinda | makasar | pontianak | banjarmasin |
|———————————————————————————-|
| U1 | Herman | B 123 KK | 10 | 5 |45 | 25 |
| U2 | Budi | B 555 KLM | 20 | 25 |25 | 22 |
| U3 | Santoso | B 675 PO | 35 | 30 |20 |10 |
———————————————————————————–
DB : Bongkaran
——————————————————————————
| id_bongkar | id | user | wilayah | unit | No Pol | Supir |
——————————————————————————
| B1 | U1 | didi | samarinda | 10 | B 123 KK | Herman |
| B2 | U1 | joko | makasar | 5 | B 123 KK | Herman |
—————————————————————————–
Hasil Yang Diinginkan
|——————————————————————————————————————–|
| id | Supir | No Pol | samarinda | makasar | pontianak | banjarmasin | u_srd | u_mks |u_ptk | u_bjm |
|——————————————————————————————————————–|
| U1 | Herman | B 123 KK | 10 | 5 |45 | 25 | didi | joko | null | null |
| U2 | Budi | B 555 KLM | 20 | 25 |25 | 22 | null | null | null | null |
| U3 | Santoso | B 675 PO | 35 | 30 |20 | 10 | null | null | null | null |
——————————————————————————————————————–|
Coba pakai left join mas: