Day 33: SQL Untuk Modeling


Learning In HomeOriginal Date: 14 Februari 2009

Hari Valentine akhirnya tiba juga. Nuansa cinta terlihat dimana-mana, gadis manis tetangga yang sering menatapku (?) juga terlihat tambah menarik. Komunikasi tanpa kata-kata (dan tanpa protocol tentunya) diantara kami memang sulit dipahami, tapi itu bukanlah topik tulisan hari ini. Pagi ini, aku akan kembali mempelajari menggunakan SQL. Kali ini dalam kaitannya dengan MODEL yang memungkinkan manipulasi isi tabel sampai ke tahap cell. Sebagai contoh, misalnya, aku membuat sebuah tabel sederhana yang mirip lembaran kerja di Excel:


CREATE TABLE tbl_latihan_model (
  A VARCHAR2(10),
  B VARCHAR2(10),
  C VARCHAR2(10),
  D NUMBER(10)
);

INSERT INTO tbl_latihan_model 
  VALUES ('A1', 'B1', 'C1', 10);
INSERT INTO tbl_latihan_model 
  VALUES ('A2', 'B2', 'C2', 20);
INSERT INTO tbl_latihan_model 
  VALUES ('A3', 'B3', 'C3', 30);
INSERT INTO tbl_latihan_model 
  VALUES ('A4', 'B4', 'C4', 40);
INSERT INTO tbl_latihan_model 
  VALUES ('A5', 'B5', 'C5', 50);
INSERT INTO tbl_latihan_model 
  VALUES ('A6', 'B6', 'C6', 60);

Lalu, aku ingin mengubah nilai kolom D sesuai keinginan dengan MODEL:


SELECT
*
FROM
tbl_latihan_model
MODEL
DIMENSION BY (A, B, C)
MEASURES (D)
RULES UPDATE (
D[A='A1', B='B1', C='C1'] = 999,
D[A='A4', B='B4', C='C4'] = D[A='A1', B='B1', C='C1'] + 1
)
ORDER BY A
;

Hasil akhirnya akan mirip seperti ini:


-------------------
 A   B   C   D
-------------------
 A1  B1  C1   999
 A2  B2  C2    20
 A3  B3  C3    30
 A4  B4  C4  1000
 A5  B5  C5    50
 A6  B6  C6    60
-------------------

Aku telah mengubah nilai kolom D di baris 1 menjadi 999. Bukan hanya itu, aku juga mengubah nilai kolom D di baris 4 menjadi nilai kolom D di baris pertama ditambah dengan 1. Semuanya itu dalam sekali query. Dan bahkan bisa lebih lagi, dengan menambah statement baru di bagian klausa RULES.

Contoh yang lebih berguna, misalnya, aku akan menghitung dan menampilkan diskon untuk produk berdasarkan rule yang telah aku tentukan:


SELECT 
  tanggal,
  kategori_id,
  sum_jumlah,
  diskon
FROM 
  (SELECT
      tanggal, 
      brg.id AS brg_id, 
      SUM(pb.jumlah) AS sum_jumlah
   FROM
      tbl_pembelian pb, tbl_barang brg
   WHERE
      pb.barang_id = brg.id
   GROUP BY
      tanggal, brg.id
  ) pb,
  tbl_kategori kat, 
  tbl_barang brg
WHERE
  pb.brg_id = brg.id AND
  brg.kategori = kat.id 
MODEL  
  PARTITION BY (tanggal)
  DIMENSION BY (
    brg_id, 
    kat.id as kategori_id, 
    sum_jumlah)
  MEASURES (0 as diskon)
  RULES UPDATE (
     diskon[any, 
            any, 
            sum_jumlah > 10] = 0.01,
     diskon[any, 
            kategori_id = 3, 
            any] = 
      diskon[cv(brg_id), 
             cv(kategori_id), 
             cv(sum_jumlah)] +
        cv(sum_jumlah) * 0.1
  )
ORDER BY
  tanggal
;  

Pada contoh tersebut, aku memberikan dua rule, yaitu diskon sebesar 0.01 untuk jika atribut sum_jumlah lebih dari 10. Selain itu, jika kategori_id adalah 3, maka aku akan menambahkan diskon sebesar 0.01 dari sum_jumlah saat ini. Aku menggunakan fungsi cv() untuk mendapatkan nilai saat cell saat ini (cell yang sedang diproses). Contoh hasil query-nya, misalnya:


---------------------------------
 TANGGAL KATEGORI SUM     DISKON
         ID       JUMLAH 
---------------------------------
 28       5         2        0
 28       3        13     1,31
 30      10        15     0,01
 30       4         4        0
 31       3         2      0,2
---------------------------------

Sekarang sudah saatnya untuk beristirahat sejenak, sebab tadi aku melihat the girl next door sudah pulang. Rambutnya yang panjang dibiarkan terurai rapi.. Ini pasti pertanda yang baik di hari Valentine. Aku jadi semakin betah disini.

Perihal Solid Snake
I'm nothing...

One Response to Day 33: SQL Untuk Modeling

  1. cutez mengatakan:

    “Sekarang sudah saatnya untuk beristirahat sejenak, sebab tadi aku melihat the girl next door sudah pulang. Rambutnya yang panjang dibiarkan terurai rapi.. Ini pasti pertanda yang baik di hari Valentine. Aku jadi semakin betah disini.

    “Oh jadi ini yang semakin betah disana?? x-(

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: