JNet99

Enjoy Saja Bro

Penggunaan Perintah CASE Dalam SQL

Penggunaan Perintah CASE Dalam SQL

mylovePerintah CASE sering digunakan untuk menampilkan nilai tertentu dari beberapa barisan data dengan syarat-syarat atau kondisi yang kita berikan.

Kalau kita belajar bahasa pemrograman tentu kita kenal dengan perintah IF Condition, fungsinya CASE hampir sama. Bedanya perintah CASE digunakan untuk beberapa kondisi sekaligus, dan didalam SQL perintah CASE tidak bisa berdiri sendiri melainkan harus disisipkan dalam perintah SELECT. Jadi berbeda dengan perintah IF yang lebih bebas, akan tetapi perintah IF hanya berguna apabila dimasukan dalam STORE PROCEDURE, FUNCTION dan TRIGGER. Perbedaannya dalam SQL sangat jelas sekali, karena perintah CASE disisipkan dalam perintah SELECT jadi yang dihasilkan langsung berupa DATASET dan langsung bisa dilihat hasilnya.

Perintah CASE ini mempunyai dua format :

1. Simple Case function :

Maksudnya adalah perintah CASE sederhana.

Bentuk Sintaknya

CASE input_expression
WHEN when_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
]
END

2. Searched CASE function:

Maksudnya perintah CASE ini diikuti dengan syarat kondisi boolean, seperti >, <, >=, <= , dan lain-lain.

Sintaknya sebagai berikut.

CASE
WHEN Boolean_expression THEN result_expression
[ ...n ]
[
ELSE else_result_expression
]
END

Saya akan memberikan contoh dari kedua jenis CASE tersebut agar dapat bisa membedakan, kapan saat kita memakai Simple Case dan kapan saat kita memakai Search Case.

Terlebih dahulu saya akan memberi contoh Simple Case,

Misalnya kita mempunyai lima kategori penilaian terhadap nilai ujian Mahasiswa.

A = Sangat Baik, B = ‘Baik’, C = ‘Cukup’, D = ‘Jelek’, E = ‘Sangat Jelek’

Dibawah ini ada tabel dasar berupa nilai ujian dari sejumlah Mahasiswa, kita namakan saja tb_nilai

No_induk Nilai
M1001 A
M1002 B
M1003 D
M1004 E
M1005 A
M1006 C
M1007 B
M1008 E
M1009 A
M1010 D

Dari data tersebut kita ingin mengkonversikan nilai-nilai tersebut dengan memakai perintah CASE sehingga menghasilkan barisan data dibawah ini.

No_induk Nilai Keterangan
M1001 A Sangat Baik
M1002 B Baik
M1003 D Jelek
M1004 E Sangat Jelek
M1005 A Sangat Baik
M1006 C Cukup
M1007 B Baik
M1008 E Sangat Jelek
M1009 A Sangat Baik
M1010 D Jelek

Untuk menghasilkan data diatas kita menggunakan skrip SQL sebagai berikut :

SELECT no_induk, nilai,
keterangan =
CASE nilai
WHEN ‘A’ THEN ‘Sangat Baik’
WHEN ‘B’ THEN ‘Baik’
WHEN ‘C’ THEN ‘Cukup’
WHEN ‘D’ THEN ‘Jelek’
ELSE ‘Sangat Jelek’
END
FROM
tb_nilai

Dari skrip SQL tersebut terlihat kita membentuk kolom keterangan yang mana isinya sesuai dengan kondisi CASE.

Berikutnya saya akan memberi contoh Search Case,

Anggaplah kita mempunyai kategori nilai

nilai > 8,5 dapat kategori ‘A’,

nilai >6,5 dan <=8,5 kategori ‘B’

nilai > 5,5 dan <= 6,5 kategori ‘C’

nilai >4,5 dan <= 5,5 kategori ‘D’

Nilai <= 4,5 kategori E.

Dan kita mempunyai tabel kita beri nama saja daftar_nilai dengan isi sebagai berikut

No_induk Nilai
M1001 9
M1002 8
M1003 6
M1004 4.5
M1005 3
M1006 5.5
M1007 8
M1008 7
M1009 6
M1010 6.5

Dan kita ingin menghasilkan suatu dataset yang bentuk tampilannya sebagai berikut :

No_induk Nilai Kategori
M1001 9 A
M1002 8 C
M1003 6 B
M1004 4.5 E
M1005 3 E
M1006 5.5 D
M1007 8 B
M1008 7 B
M1009 6 C
M1010 6.5 C

Maka Skrip yang akan harus ditulis sebagai berikut :

SELECT no_induk, nilai, kategori =
CASE
WHEN nilai > 8.5 THEN ‘A’
WHEN nilai > 6.5 THEN ‘B’
WHEN nilai > 5.5 THEN ‘C’
WHEN nilai > 4.5 THEN ‘D’
ELSE ‘E’
END
FROM daftar_nilai

Kedua contoh diatas merupakan contoh-contoh sederhana dan apabila sudah dipahami dapat dikembangkan lebih lanjut sesuai dengan kebutuhan situasi.

Mudah-mudahan dapat bermanfaat bagi yang suka bermain-main dengan SQL.

Selamat mencoba dan semoga Anda beruntung.

Artikel lainnya

Filed under: SQL , ,

7 Responses

  1. Budi mengatakan:

    saya sudah coba penggungaan perintah case dalam sql namun tidak jalan, contoh nilai saya ganti dengan skor, skor hasil dari nilai rata-rata avg(NilSis.nilai) as skor, bisa dibantu
    skrip saya seperti ini

    with query1 do begin
    close;
    sql.clear;
    sql.add(‘Select NilSis.Nosis,avg(Nilsis.Nilai)as skor,Predikat =
    case
    when Skor >90 then ‘Sangat Memuaskan’
    when skor >80 then ‘Memuaskan’
    when skor >70 then ‘Cukup Memuaskan’
    else ‘Kurang Memuaskan’
    end
    form NilSis

    jawab :
    disini Anda menggunakan fungsi Aggregat yang AVG, jadi perintahnya SQL nya ada yang kurang, SKOR juga tidak terdeteksi saat memberikan syarat kondisional, jadi perintah SQL semestinya sbb :

    Select NilSis.Nosis,avg(Nilsis.Nilai) as skor,Predikat =
    case
    when avg(Nilsis.Nilai) >90 then ‘Sangat Memuaskan’
    when avg(Nilsis.Nilai) >80 then ‘Memuaskan’
    when avg(Nilsis.Nilai) >70 then ‘Cukup Memuaskan’
    else ‘Kurang Memuaskan’
    end
    from Nilsis
    GROUP BY NilSis.Noss

    mudah2an skrip diatas bisa membantu.

    • Budi mengatakan:

      saya sudah coba source diatas tapi belum bisa muncul keterangan

      Invalid use of keyword
      Token:=
      case
      when
      Line Number: 1

      saya pake delphi 7 database paradox

      jawab : Pake Paradox memang tidak bisa menggunakan CASE.

      • Budi mengatakan:

        bisa kasih alternatif lain / fungsi lain untuk hasil yang sama, databasenya tetap database paradox,
        please……

        jawab :
        Alternatif yang lain bisa Anda lakukan dengan memodifikasi perintah di Delphi,
        jadi bukan pada SQL nya. Dilihat dari skrip yang Anda berikan, Anda telah menggunakan
        Dynamic SQL, Coba di ubah ke Static SQL.
        Skrip Anda diatas dihapus semua.
        Dan pada komponen query1 masuk objectInspector-propertis klik pada bagian SQL.
        Isikan perintah berikut :

        Select NilSis.Nosis,avg(Nilsis.Nilai) as skor from NilSis

        kemudian klik dua kali komponen Query1.
        Disini akan muncul box kosong, klik kanan box tersebut pilih add all fields.
        Setelah nama2 field terisi.
        Langkah selanjutnya Anda membuat virtual field yaitu dengan cara klik kanan kembali box tadi,
        kemudian pilih new fied.
        Disini akan muncul form yang harus Anda isi

        Name = Predikat
        Type = String
        Size = 20

        Pada Field Type, Anda pilih calculated, terus tekan tombol “OK”.
        Sampai disini Anda sudah selesai pada pembuatan virtual field bernama “Predikat”.

        Langkah selanjutnya adalah mengisi data pada virtual field tersebut.
        Caranya begini, pada object inspector komponen Query1 pada bagian events Anda pilih
        OnCalcFields klik dua kali.
        Perintah yang harus diisi :

        procedure TForm1.Query1CalcFields(DataSet: TDataSet);
        begin

        //ini yang harus diisikan

        if Query1skor.AsFloat > 90 then DataSet['Predikat']:= ‘Sangat Memuaskan’
        else if Query1skor.AsFloat > 80 DataSet['Predikat']:= ‘Memuaskan’
        else if Query1skor.AsFloat > 70 DataSet['Predikat']:= ‘Cukup Memuaskan’
        else DataSet['Predikat']:= ‘Kurang Memuaskan’

        end;

        Virtual field hasilnya dapat dilihat sewaktu program dalam keadaan running,
        Jadi sebaiknya Anda menambahkan komponen tombol untuk mengeksekusi Query1 tersebut :
        Jadi pada tombol tersebut pada OnClick isi perintahnya sebagai berikut :

        procedure TForm1.Button1Click(Sender: TObject);
        begin
        query1.close;
        query1.open;
        end;

        Untuk menampilkan hasilnya saya kira Anda sudah mengerti yaitu lewat DBGRID.

        Dengan saran Alternatif ini mudah2an Anda bisa berhasil.

      • Anonim mengatakan:

        terima kasih saya sudah coba alternatif menggunakan static sql dan berhasil, kalau diijinkan saya mau tanya lagi pada tabel yang sama untuk nilai skor khan hasil dari avg(NilSis.Nilai) as Skor saat ditampilkan kedalam grid hasilnya angka dibalakang koma banyak sekali misal 85,3333333333333.. saya mau membatasi hanya dua angka dibelakang koma misal 85,33

  2. Budi mengatakan:

    terima kasih saya sudah coba dan berhasil, saya masih ada pertanyaan lagi untuk nilai hasil AVG(Nilsis.Nilai) as skor angka dibelakan koma terlalu banyak saya mau jadikan 2 angka dibelakang koma misalnya 85,3333333… menjadi 85,33 gimana caranya, makasih sebelumnya

    jawab : Komponen Query Anda klik dua kali, setelah muncul nama-nama field pilih field skor, dan setting object inspector properties nya pilih Display Format dan isikan “#,##0.00″ tanpa tanda petik

    • Budi mengatakan:

      terima kasih saya sudah coba dan berhasil, kalo masih ada kesulitan lagi masih bisa bertanya nggak ?

      jawab : boleh-boleh saja

      • Budi mengatakan:

        gini mas saya punya tabel tampilan di DBGrid secara umum seperti dibawah ini:

        Mata_Kuliah Nilai
        Word A
        Excel B
        P.Point B
        Access C

        Bisa gak posisinya diubah menjadi seperti dibawah ini :

        Mata_Kuliah Word Excel P.Point Access
        Nilai A B B C

        terima kasih sebelumnya..
        saya pake program delphi 7 database paradox

        jawab : Tentu Anda masih ingat cara membuat virtual field, jadi bikin dulu virtual field nya sebanyak 4 (empat) field, dengan masing-masing nama : word, excel, p_point, dan access.

        masing-masing ber type string,
        dan masing-masing size nya cukup 1 saja.

        Dan pada Query1 – OnCalcFields pada masing-masing field diisi dengan

        ===============
        jika pada word

        if query1Mata_kuliah.asstring = ‘word’ then dataset['word'] := datasetNilai.asstring
        else datasetNilai.asstring:=”;

        ===================
        Begitu juga dengan excel, power point dan seterusnya

Leave a Reply

delicious