RSS
When someone shares something of value with you and you benefit from it, you have a moral obligation to share it with others...

Join, Group dan Pivot

Join dan group hampir selalu digunakan pada basis data relational yang memenuhi normalisasi. Tabel pivot atau cross-tab sering diperlukan ketika ingin melihat informasi dari dimensi yang berbeda. Pada contoh yang lalu, setelah dilakukan normalisasi, menghasilkan dua buah tabel, yaitu tabel turai (yang berisikan uraian) dan transaksi (yang berisikan transaksi setiap uraian). Lihat kembali posting Dzaky tentang intro rollup, null-rollup, dan ifnull-rollup yang membahas tentang group with rollup.
Setelah melalui beberapa studi kasus, Dzaky mendapatkan tabel seperti ini

Tabel Uraian
pk uraian kode
1Makan siangK
2 Makan malam K
3 Beli rokok K
4 Makan Sate K
5 Sarapan Pagi K
6 Honor M


Tabel Transaksi
tanggal pk jumlah
2012-02-01115000
2012-02-01212500
2012-02-01310000
2012-02-01425000
2012-02-0255000
2012-02-02112500
2012-02-02220000
2012-02-02310000
2012-01-316750000
2012-02-056500000
2012-04-03325000
2012-04-03440000
2012-04-03325000
2012-04-03440000
2012-04-03325000
2012-04-03440000
2012-04-03325000
2012-04-03440000
2012-04-1922460

Untuk mendapatkan kembali informasi lengkap dari kedua tabel, dilakukan dengan klausa JOIN.

SELECT t.tanggal, u.uraian, u.kode, t.jumlah
FROM transaksi t JOIN ( turai u )
WHERE t.pk = u.pk;

dan hasilnya bisa dilihat disini

tanggal uraian kode Jumlah
2012-02-01Makan siangK15000
2012-02-02Makan siangK12500
2012-02-01Makan malamK12500
2012-02-02Makan malamK20000
2012-04-19Makan malamK2460
2012-02-01Beli rokokK10000
2012-02-02Beli rokokK10000
2012-04-03Beli rokokK25000
2012-04-03Beli rokokK25000
2012-04-03Beli rokokK25000
2012-04-03Beli rokokK25000
2012-02-01Makan SateK25000
2012-04-03Makan SateK40000
2012-04-03Makan SateK40000
2012-04-03Makan SateK40000
2012-04-03Makan SateK40000
2012-02-02Sarapan PagiK5000
2012-01-31HonorM750000
2012-02-05HonorM500000

Akan semakin menarik bila informasi yang disajikan lebih simple, misal sudah berapa banyak uang yang digunakan untuk setiap uraian. Untuk itu diperlukan klausa group dan fungsi agregat sum.

SELECT t.tanggal, u.uraian, u.kode,
sum(t.jumlah) as jumlah
FROM transaksi t JOIN ( turai u )
WHERE t.pk = u.pk
GROUP BY u.uraian

dan hasilnya bisa dilihat disini

tanggal uraian kode Jumlah
2012-02-01Beli rokokK120000
2012-01-31HonorM1250000
2012-02-01Makan malamK34960
2012-02-01Makan SateK185000
2012-02-01Makan siangK27500
2012-02-02Sarapan PagiK5000

Sudah kelihatan lebih informatif. Apa lagi? Masih ada, dari kode yang ada menyatakan M[asuk] dan K[keluar]. Bagaimana kalau untuk uang keluar ditandai dengan negatif?

SELECT t.tanggal, u.uraian,
SUM(IF(kode='K',-t.jumlah,t.jumlah)) AS JUMLAH
FROM transaksi t JOIN ( turai u )
WHERE t.pk = u.pk
GROUP BY uraian

dan hasilnya bisa dilihat disini

tanggal uraian Jumlah
2012-02-01Beli rokok-120000
2012-01-31Honor1250000
2012-02-01Makan malam-34960
2012-02-01Makan Sate-185000
2012-02-01Makan siang-27500
2012-02-02Sarapan Pagi-5000

Ah..ha sudah semakin menarik informasinya. Oh iya, berapa sisa uang ayah? Jangan-jangan....

SELECT t.tanggal , IFNULL(u.uraian,'TOTAL') AS URAIAN,
SUM(IF(kode='K',-t.jumlah,t.jumlah)) AS JUMLAH
FROM transaksi t JOIN ( turai u )
WHERE t.pk = u.pk
GROUP BY uraian with ROLLUP

dan hasilnya bisa dilihat disini

tanggal uraian Jumlah
2012-02-01Beli rokok-120000
2012-01-31Honor1250000
2012-02-01Makan malam-34960
2012-04-03Makan Sate-185000
2012-02-01Makan siang-27500
2012-02-02Sarapan Pagi-5000
2012-02-02TOTAL877540

Ho..ho.. semakin asyik saja. Sekarang Dzaky mau kelompokkan berdasarkan uang yang masuk dan uang yang keluar serta selisihnya.

SELECT IF(u.kode='K','Uang Keluar',
IF(u.kode='M','Uang Masuk','SELISIH')) AS KETERANGAN,
SUM(IF(kode='K',-t.jumlah,t.jumlah)) AS JUMLAH
FROM transaksi t JOIN ( turai u )
WHERE t.pk = u.pk
GROUP BY u.kode with rollup

dan hasilnya bisa dilihat disini

Keterangan Jumlah
Uang Keluar-372460
Uang Masuk1250000
SELISIH877540

Oke..oke.. bagaimana dengan pivot atau cross-tab?