Belajar SQL | Membuat laporan summary data dari table di database bisa dibilang gampang-gampang susah. Gampang ketika hanya membuat summary dengan sumber data satu buah table saja. Namun jadi makin rumit ketika summary melibatkan 2 (dua) table atau lebih. Silakan pelajari TUTORIAL berikut ini sebagai salah satu contoh kasus untuk membuat summary data dari 3 buah table terpisah.
Pertama-tama kita buat Table MASTER untuk sample data menggunakan perintah SQL CREATE TABLE … AS SELECT … kemudian tampilkan isinya untuk memastikan.
mysql> create table t_master as
-> select 1 id, 'A' data union all
-> select 2 id, 'B' data union all
-> select 3 id, 'C' data ;
Query OK, 3 rows affected (0.19 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from t_master ;
+----+------+
| id | data |
+----+------+
| 1 | A |
| 2 | B |
| 3 | C |
+----+------+
3 rows in set (0.00 sec)
Kemudian buat table TRANSAKSI pertama juga menggunakan perintah SQL CREATE TABLE … AS SELECT … kemudian tampilkan isinya untuk memastikan.
mysql> create table t_transaksi_1 as
-> select 1 id, 'DOC 1' doc, 2000 value union all
-> select 1 id, 'DOC 1' doc, 1000 value union all
-> select 2 id, 'DOC 2' doc, 5000 value union all
-> select 3 id, 'DOC 3' doc, 3000 value union all
-> select 3 id, 'DOC 4' doc, 3000 value union all
-> select 3 id, 'DOC 4' doc, 2000 value ;
Query OK, 6 rows affected (0.30 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> select * from t_transaksi_1 ;
+----+-------+-------+
| id | doc | value |
+----+-------+-------+
| 1 | DOC 1 | 2000 |
| 1 | DOC 1 | 1000 |
| 2 | DOC 2 | 5000 |
| 3 | DOC 3 | 3000 |
| 3 | DOC 4 | 3000 |
| 3 | DOC 4 | 2000 |
+----+-------+-------+
6 rows in set (0.00 sec)
Berikutnya buat table TRANSAKSI kedua juga menggunakan perintah SQL CREATE TABLE … AS SELECT … kemudian tampilkan isinya untuk memastikan.
mysql> create table t_transaksi_2 as
-> select 2 id, 'DOC 2' doc, 2000 value union all
-> select 2 id, 'DOC 2' doc, 2000 value union all
-> select 3 id, 'DOC 3' doc, 4000 value union all
-> select 3 id, 'DOC 4' doc, 5000 value union all
-> select 3 id, 'DOC 4' doc, 1000 value ;
Query OK, 5 rows affected (0.15 sec)
Records: 5 Duplicates: 0 Warnings: 0
mysql> select * from t_transaksi_2 ;
+----+-------+-------+
| id | doc | value |
+----+-------+-------+
| 2 | DOC 2 | 2000 |
| 2 | DOC 2 | 2000 |
| 3 | DOC 3 | 4000 |
| 3 | DOC 4 | 5000 |
| 3 | DOC 4 | 1000 |
+----+-------+-------+
5 rows in set (0.00 sec)
Sekarang kita buatkan summary untuk table TRANSAKSI pertama, menggunakan GROUP BY dan fungsi aggregat SUM()
mysql> select tm.id, data, doc, sum(value) value1
-> from t_master tm
-> join t_transaksi_1 tr on tm.id=tr.id
-> group by id, doc
-> ;
+----+------+-------+---------+
| id | data | doc | value11 |
+----+------+-------+---------+
| 1 | A | DOC 1 | 3000 |
| 2 | B | DOC 2 | 5000 |
| 3 | C | DOC 3 | 3000 |
| 3 | C | DOC 4 | 5000 |
+----+------+-------+---------+
4 rows in set (0.00 sec)
Sekarang kita buatkan summary untuk table TRANSAKSI kedua, menggunakan GROUP BY dan fungsi aggregat SUM().
mysql> select tm.id, data, doc, sum(value) value2
-> from t_master tm
-> join t_transaksi_2 tr on tm.id=tr.id
-> group by id, doc ;
+----+------+-------+---------+
| id | data | doc | value12 |
+----+------+-------+---------+
| 2 | B | DOC 2 | 4000 |
| 3 | C | DOC 3 | 4000 |
| 3 | C | DOC 4 | 6000 |
+----+------+-------+---------+
3 rows in set (0.00 sec)
Sekarang gabungkan SUMMARY dari TRANSAKSI pertama dan kedua, menggunakan LEFT JOIN menjadi seperti ini.
mysql> select res1.id, res1.data, res1.doc
-> , value1
-> , value2
-> from (
-> select tm.id, data, doc, sum(value) value1
-> from t_master tm
-> join t_transaksi_1 tr on tm.id=tr.id
-> group by id, doc
-> ) res1
-> left join (
-> select tm.id, data, doc, sum(value) value2
-> from t_master tm
-> join t_transaksi_2 tr on tm.id=tr.id
-> group by id, doc
-> ) res2 on res1.id=res2.id and res1.doc=res2.doc ;
+----+------+-------+--------+--------+
| id | data | doc | value1 | value2 |
+----+------+-------+--------+--------+
| 1 | A | DOC 1 | 3000 | NULL |
| 2 | B | DOC 2 | 5000 | 4000 |
| 3 | C | DOC 3 | 3000 | 4000 |
| 3 | C | DOC 4 | 5000 | 6000 |
+----+------+-------+--------+--------+
4 rows in set (0.00 sec)
Namun masih ada yang sedikit aneh, karena ada nilai NULL di sana, maka kita gunakan perintah IFNULL() untuk mengunbahknya menjadi angka 0 (nol).
mysql> select res1.id, res1.data, res1.doc
-> , ifnull(value1,0) value1
-> , ifnull(value2,0) value2
-> from (
-> select tm.id, data, doc, sum(value) value1
-> from t_master tm
-> join t_transaksi_1 tr on tm.id=tr.id
-> group by id, doc
-> ) res1
-> left join (
-> select tm.id, data, doc, sum(value) value2
-> from t_master tm
-> join t_transaksi_2 tr on tm.id=tr.id
-> group by id, doc
-> ) res2 on res1.id=res2.id and res1.doc=res2.doc ;
+----+------+-------+--------+--------+
| id | data | doc | value1 | value2 |
+----+------+-------+--------+--------+
| 1 | A | DOC 1 | 3000 | 0 |
| 2 | B | DOC 2 | 5000 | 4000 |
| 3 | C | DOC 3 | 3000 | 4000 |
| 3 | C | DOC 4 | 5000 | 6000 |
+----+------+-------+--------+--------+
4 rows in set (0.00 sec)
Demikian TUTORIAL ini semoga membantu memahami penggunaan SUBQUERY, JOIN, GROUP BY, dan fungsi agregate SUM.
