Showing posts with label Oracle. Show all posts
Showing posts with label Oracle. Show all posts

MENGATASI DUPLIKASI DATA DALAM QUERY

MENGATASI DUPLIKASI DATA DALAM QUERY


MENGATASI DUPLIKASI DATA DALAM QUERY

Dalam mengotak-atik query, terkadang kita harus menggunakan beberapa tabel dalam database. Dan tentu saja, dari masing-masing tabel terdapat key yang identik, sehingga tabel-tabel bisa saling dihubungkan.Anggap Anda telah memahami tentang penjoinan tabel. Nah, masalah yang sering muncul adalah, duplikasi data pada query. Ya, duplikasi ini bisa disebabkan beberapa hal. Misalkan dua tabel yang dihubungkan tidak memiliki key yang unik. Pemasangan non-unique key memang bisa dilakukan. Namun, resiko ada data kembar kemungkinan besar terjadi.
           Kedua, tidak adanya key penghubung yang cukup kuat. Dalam kasus tabel dengan banyak field, kita sering menemui adanya lebih daru satu primary key yang bisa dimanfaatkan. Nah, kesalahan yang sering terjadi adalah, kita tidak memasangkan cukup banyak atau spesifik dari key tabel satu ke tabel lainnya.
Pahit nih...
       Untuk database dengan sedikit tabel, field, dan data, tentu relatif mudah dalam memeriksa atau menelusuri penyebab terjadinya duplikasi. Tapih, bagaimana kalau database sudah complicated secara struktur dan isiny?. Aduh, perlu kerja keras sekeras-kerasnya...
Beberapa tips untuk mengatasi data kembar dalam melakukan query. Dimulai dari tindakan pencegahan dulu.
Pertama, selalu upayakan tiap tabel paling tidak memiliki satu unique primary key, yang menjadi 'identitas' dari sang tabel.  Dengan kata lain, pastikan ada satu field yang isinya tidak pernah sama meski data menjulang hingga ribuan.
Kedua, membuat strukturasi antar tabel dengan jelas dan mudah ditelaah. Ini gampang diomongin tapi sedikit sulit diterapkan. Kita harus bisa memilah tiap tabel sesuai dengan fungsinya, pastikan untuk meminimalisir pemborosan kolom. Dalam istilah kerennya sering disingkat normalisasi database. Pasti pernah dengar normalisasi waduk di Jakarta,'kan? Nah, mirip-mirip kok. Hehehe...
          Tujuannya adalah sama-sama menghilangkan jumlah data yang berlebihan. Jika satu kolom bisa dipakai untuk dependency banyak tabel, kenapa harus memasukkan kolom itu disetiap tabel? Tentunya akan membengkakkan kapasitas tabel. Kalau datanya cuma puluhan mungkin tak terasa. Tapi di instansi besar yang memiliki data hingga puluhan hingga ratusan ribu, ini hal sentimen yang kudu diperhatikan.
Nah, sekarang dari tindakan non-preventif.
Tips untuk menghilangkan data ganda pada query adalah dengan pemakaian distinct.
Syntax :
select distinct bla bla bla...
Mudah 'kan?
Yang perlu dilakukan hanyalah menempatkan kata distinct setelah select. Distinct sendiri berasal dari bahasa Inggris yang artinya jelas, terang, atau berbeda. Nah, dengan adanya command ini, maka query akan memproses data yang pure beda.
Contoh data tanpa distinct:
Select nama_pegawai, nomor_induk, status from tpegawai
Maka muncul hasil seperti di bawah :
Nama_pegawai
Nomor_induk
Status
John
12300
Lajang
Herman
12301
Duda
Budi
12302
Lajang
Anduk
12303
Menikah
Budi
2302
Lajang

Perhatikan. Dari contoh di atas, terdapat dua data Budi. Hal ini bisa terjadi karena salah input dua kali, atau join table yang kurang tepat. (Dalam kasus ini hanya memakai satu tabel, jadi tidak ada join).
Wah, gak lucu dong kalau muncul data dua kali. Untuk itu, kita bisa menambahkan perintah distinct setelah select sehingga hasil query menjadi :
Nama_pegawai
Nomor_induk
Status
John
12300
Lajang
Herman
12301
Duda
Budi
12302
Lajang
Anduk
12303
Menikah

Lihat, hanya tinggal ada 4 row. Data yang duplikat telah lenyap dan yang muncul hanyalah data yang memang berbeda. Eitss.. Ada beberapa hal yang perlu diperhatikan dalam pemakaian distinct.
1.      Distinct tidak menghapus data di tabel. Ya, distinct hanya 'menghilangkan' data dobel di query. Sedangkan di source aslinya tetap ada ganda. Distinct tidak menghilangkan duplikasi satu kolom saja. Ya, lihat dari contoh di atas. Ada 3 buah kolom dan 4 row yang muncul.
Contohnya :
Nama_pegawai
Jenis_kelamin
Umur
Budi
Pria
27
Budi
Pria
27
Budi
Pria
25
Dari contoh itu, maka yang dimaksud duplikat adalah nomor 1 dan 2. Kenapa? Karena datanya sama! Dari kolom 1 hingga akhir tidak ada yang berbeda. Sementara itu, meski data nomor tiga Budi dan Prianya sama dengan yang lain. Tapi tidak dianggap duplikasi. Karena ada kolom lain yang berbeda, yaitu umurnya 25. Jadi, distinct melakukan pengecekan duplikasi tidak per kolom. Tapi menyeluruh semua kolom pada tiap row.
Insya Allah, semoga sedikit informasi ini dapat bermanfaat!

PEMAKAIAN FUNGSI ADD_MONTHS PADA SQL ORACLE

PEMAKAIAN FUNGSI ADD_MONTHS PADA SQL ORACLE
PEMAKAIAN FUNGSI ADD_MONTHS PADA SQL ORACLE

Kembali lagi bertemu! Kali ini saya siap share lagi ilmu tentang sql!

     Terkadang, dalam sql oracle, kita tidak hanya melakukan manipulasi terhadap data bertipe numeric dan string saja. Tipe data Date pun sesekali meramaikan query yang memusingkan kepala. Salah satu fitur sql Oracle untuk melakukan manipulasi data tanggal adalah add_months...

Add_months? Hah, terdengar simpel...

     Yah, sepertinya tidak perlu dijelaskan dengan detail. Dari namanya saja sudah ketahuan ya, hehe. Add_months merupakan syntax yang digunakan untuk menambahkan jumlah bulan dari tanggal yang kita inputkan. Proses ini tidak hanya untuk menambahkan dari bulan sekarang, tapi juga bisa untuk melakukan pengurangan bulan.
Syntax :
Add_months(tanggal, jumlah bulan yang ingin ditambahkan)
Contoh :
Select Add_months('12-SEP-2013',1) from dual
Maka akan memiliki result :
12-OCT-2013
     Coba perhatikan, angka 1 mewakili jumlah bulan yang kita inginkan. Angka ini merupakan bilangan bulat mutlak tanpa desimal. Dengan kata lain, jika kita memasukkan bilangan desimal misalkan 1.5 atau 1, keduanya tetap akan dihitung sebagai 1. Ini juga berlaku untuk bilangan setelah koma pada 0, misalkan 0.5 atau 0.8. Meskipun data bisa dibulatkan menjadi 1, namun sql tetap membaca sebagai 0. Sehingga pemberian syntax seperti ini tidak akan berarti apa pun. Karena sekali lagi, yang dihitung adalah bulan, bukan hari, minggu, atau punjam.
Contoh :
Select Add_months('12-SEP-2013',0) from dual
Maka akan memiliki result :
12-SEP-2013 -- hasil tetap konstan, tidak terjadi perubahan.
     Bagian n jumlah di belakang ini tidak memiliki batas sih. Meski pun bulan cuma ada 12, kita tetap bisa menginputkannya dengan nominal sebesar 50, bahkan 1000. Sungguh super sekali. (Kalau ini udah aneh-aneh nih...)
Contoh :
Select Add_months('12-SEP-2013',1000) from dual
Maka akan memiliki result :
12-JAN-2097
     Penggunaan lain yang tidak kalah penting yaitu adalah pemakaian minus pada fitur ini. Yup, dengan minus bulan akan dikurangi dari tanggal yang kita inputkan.
Contoh :
Select Add_months('12-SEP-2013',-1) from dual
Maka akan memiliki result :
12-AUG-2013
     Lalu pertanyaannya, untuk apa sih syntax aneh macam begini digunakan? Memangnya ada orang yang akan melakukan penghitungan bulan?
Jawabannya : ADA!
Jelas, jelas, jelas. Setiap hari setiap saat, disadari atau tidak kita tak bisa lepas dari yang namanya tanggal alias Date. Dalam dunia bisnis dan perusahaan, tanggal merupakan komponen penting karena menyangkut masalah administrasi internal, koneksi dengan mitra usaha, hingga menjadi patokan dalam urusan pelanggan. Dan simak saja, banyak database di perusahaan besar, MAU TAK MAU menginputkan tanggal dalam setiap transaksi. Baik itu transaksi dengan stakeholder luar, transaksi jual beli dengan pelanggan, maupun untuk audit internal.
Nah, tugas kita sebagai seorang programmer, sudah barang tentu dituntut untuk bisa menyediakan data yang pas. Dan tanggal merupakan data yang sangat sensitif. Kesalahan satu hari, satu jam saja terkadang bisa menimbulkan petaka. Apalagi jika kita mendapatkan job untuk melakukan penghitungan tanggal. Hmm.. Dengan fitur Add_months ini, setidaknya kita bisa melakukan peringkasan script dalam proses tersebut, dan juga mudah untuk dipahami oleh programmer lain yang menjadi rekan kerja kita. Dan yang paling penting, fitur add_months membantu melakukan penghitungan bulan tidak secara manual, sehingga bisa meminimalisir kesalahan dari counting kita.

Insya Allah, semoga sedikit informasi ini bisa bermanfaat!

Penggunaan Over Partition Pada Sql Oracle

Penggunaan Over Partition Pada Sql Oracle


Penggunaan Over Partition Pada Sql Oracle

     Salah satu fitur unik lain yang dimiliki sql di oracle daripada sql biasa adalah keberadaan fungsi over partition. Salah satu syntax yang sering digunakan programmer oracle dalam mengolah query. Over partition merupakan syntax yang berguna untuk melakukan pemilahan atau grouping data berdasarkan string atau kriteria yang dimasukkan. Perintah yang satu ini berperan sama seperti halnya group by. Hanya saja memiliki beberapa perbedaan mendasar dari 'kakak'nya itu.
     Bila group by diletakkan di bagian belakang atau paling bawah dari sript, maka tidak dengan over partition. Over partition malah diletakkan pada syntax yang masih termasuk bagian select, dimana digunakan pada field tertentu yang ingin ditampilkan. Kesamaannya, baik over dan group ini membutuhkan trigger berupa syntax counting group, seperti sum, min, max, dan sebagainya.
Syntax :
     Select sum/min/max/dsb..(nama_kolom) over (partition by nama_kolom_grouping)
contoh :
     Select a.nama_siswa, sum(a.nilai_UAN) over (partition by a.nama_siswa) Total_nilai from data_nilai a
Di atas adalah example dari suatu kasus.
Misalkan dalam tabel ada beberapa nama dan nilai seperti pada kolom. Pada suatu saat, kita ingin menampilkan data berupa nama siswa, yang muncul hanya SATU saja, dan juga jumlah keseluruhan nilai UAN dari siswa bersangkutan.
Contoh tampilan tabel :
Nama_siswa
Mapel
Nilai_UAN
John
MTK
10
Herman
MTK
9
Budi
MTK
8
Anduk
MTK
8
John
Bahasa Indonesia
8
Herman
Bahasa Indonesia
9
Budi
Bahasa Indonesia
7
Anduk
Bahasa Indonesia
7
John
Bahasa Inggris
9
Herman
Bahasa Inggris
8
Budi
Bahasa Inggris
8
Anduk
Bahasa Inggris
10

     Dengan kata lain, kita membutuhkan perintah sum untuk menjumlahkan semua data. Tapi, jika hanya memakai sum saja, maka hasilnya akan ambigu (Itu pun jika tidak memasukkan nama_siswa dalam query). Karena seluruh kolom  nilai UAN pada tabel akan dihitung jadi satu. Oleh karena itu, kita perlu suatu pembeda atau grouping. Dan pada kasus ini kita menggunakan nama siswa.
Dengan memakai over partition - sama seperti group by -, maka result yang akan ditampilkan berupa dua buah kolom, satu nama siswa, kemudian yang kedua adalah kolom berisi jumlah nilai UAN dari siswa tersebut.
Hasil dari query :
Nama_siswa
Total_nilai
John
27
Herman
26
Budi
23
Anduk
25

     Penggunaan over partition, lebih mudah dalam pengaplikasian jika membutuhkan grouping yang banyak. Ditambah lagi, dalam over partition, kita tak perlu menuliskan semua field yang dimasukkan, hanya beberapa saja pun sudah bisa untuk menjalankannya. Bandingkan dengan group by yang harus menuliskan semua nama field yang masuk dalam query select.
Logika :
     select a,b,c,d,e,f, sum(g) over (partition by a,b) from tabel1
     Tidak perlu memasukkan semua dari a sampai f ke dalam (partition by ...). Bisa melakukan grouping secara terpilah, dan tak harus menggunakan semua field yang ditampilkan pada query.
     select a,b,c,d,e,f, sum(g) from tabel1 group by a,b,c,d,e,f
     Mau tidak mau harus memasukkan semua dari a sampai f untuk mentrigger sum dari g. Ada kalanya, terkadang field yang kita tampilkan, tidak diperlukan dalam proses grouping. Bahkan bila dimasukkan malah bisa mengacaukan grouping. Celakanya, padahal field tersebut pun juga harus muncul dalam result sesuai permintaan dari user. Dan jika kita memakai group by, hal ini akan menimbulkan banyak polemik karena hasil yang ditampil tak sesuai harapan. Sum yang seharusnya hanya dikelompokkan oleh 2 kolom, tapi dengan group by, dengan ‘terpaksa’ harus digolongkan dalam semua kolom yang muncul.
     Karena itulah, over partition bisa menjadi salah satu alternatif untuk mengakali keribetan ini. Walau pun, jika memakai over partition, kerepotannya adalah jika kita memakai banyak sum, atau counting group lain. Mau tidak mau , kita juga harus memasangkan over partition di seluruh kolom yang memiliki counting group di dalamnya.
Insya Allah, semoga sedikit informasi ini dapat bermanfaat!