Progres Belajar
FUNGSI AGREGASI DENGAN PENGELOMPOKKAN DATA

Setelah kegiatan pembelajaran ini, diharapkan:

  1. Siswa mampu memahami perintah grouping dalam basis data
  2. Siswa mampu menuliskan perintah fungsi agregasi dengan pengelompokan data dengan benar
  3. Siswa mampu menerapkan fungsi agregasi dengan pengelompokan data dalam basis data
HAVING

Selain dapat mengelompokkan data menggunakan GROUP BY, MariaDB juga memungkinkan kita memfilter kelompok mana yang akan disertakan dan mana yang dikecualikan.

Misalnya, kita menginginkan daftar total gaji pokok para karyawan berdasarkan ruang dimana total nominalnya hanya yang di bawah sepuluh juta. Untuk mendapatkan data ini, kita harus memfilter berdasarkan kelompok lengkap, bukan pada baris individu. WHERE tidak berfungsi di sini karena WHERE memfilter baris tertentu, bukan kelompok. Faktanya, WHERE tidak tahu apa itu kelompok.

MariaDB menyediakan klausa HAVING. HAVING sangat mirip dengan WHERE. Faktanya, semua jenis klausa WHERE yang kita gunakan sejauh ini juga dapat digunakan dengan HAVING. Satu-satunya perbedaan adalah WHERE memfilter baris dan HAVING memfilter grup/kelompok data.

Jadi, jika perintah SELECT menggunakan WHERE untuk menentukan kondisi, maka perintah GROUP BY menggunakan HAVING. Pemakaian HAVING bersama dengan GROUP BY digunakan untuk menentukan kondisi bagi GROUP BY. Perintah HAVING hanya dapat digunakan jika GROUP BY digunakan. Kemudian, hasilnya berupa kelompok yang memenuhi kondisi saja. Karena HAVING mencari dari tabel setelah pengelompokan, kolom yang digunakan dalam pernyataan kondisional selalu menggunakan kolom dari tabel yang dikelompokkan.

HAVING biasanya digunakan untuk menentukan kondisi tertentu pada GROUP BY dan kondisi tersebut berkaitan dengan fungsi agregasi. Format dasar yang digunakan adalah sebagai berikut.

SELECT FUNCTION_AGGREGATE(nama_kolom) FROM nama_tabel
GROUP BY nama_kolom
HAVING kondisi_untuk_agregasi;

Perhatikan contoh penerapan perintah GROUP BY dengan HAVING di bawah ini!

Contoh

Tabel yang kita gunakan adalah data_guru yang dapat dilihat seperti di bawah ini.

id_guru nip nama jns_kel gaji pendidikan_terakhir
G01 13254 Indah Wijaya P 4000000 S1
G02 14325 Siska Nur Azizah P 4500000 S1
G03 12543 Fauzi Rahmadi L 5000000 S2
G04 15234 Luna Ardhita Puspita P 3000000 D3
G05 13542 Hafizh L 4200000 S1
G06 15432 Dita Anggraini P 4800000 S2
G07 12235 Farhan Alfi L 3500000 D3

Misalkan kita ingin menampilkan total gaji guru berdasarkan pendidikan terakhirnya dimana total nominalnya di bawah sepuluh juta dan diurutkan dari nominal terbesar. Kita dapat menggunakan kueri sebagai berikut.


          

Hasilnya adalah:

Tabel Data Karyawan
Gambar 55. Hasil perintah HAVING 1

Cobalah kueri di atas pada kotak inputan coba kueri di bawah ini.

Coba Kueri

Hasil

Contoh selanjutnya, tabel yang kita gunakan adalah biodata_siswa yang dapat dilihat seperti di bawah ini.

id_siswa nis nama jns_kel umur tinggi_badan berat_badan
S01 13261 Aisyah Alifa P 17 155 45
S02 13262 Rendra Kurniawan L 18 173 55
S03 13263 Iqbal Maulana Hakim L 19 165 50
S04 13264 Gracia Putri Lestari P 18 158 46
S05 13265 Nanda Amira Athaya P 17 156 41
S06 13266 Fajar Setiawan L 17 153 45
S07 13267 Naura Athalia P 18 171 60
S08 13268 Irfan Maulana L 17 163 58
S09 13269 Yudi Prasetyo Nugroho L 19 175 62
S10 13270 Rayhanah Aziza P 19 154 43

Apakah perlu menggunakan klausa WHERE dan HAVING dalam satu pernyataan? Sebenarnya, ya, ada. Misalkan kita ingin menampilkan rata-rata tinggi badan siswa yang berjenis kelamin laki-laki saja dan dikelompokkan berdasarkan umurnya dimana rata-rata tingginya yang lebih dari atau sama dengan 170. Kita dapat menggunakan kueri sebagai berikut.


          

Hasilnya adalah:

Tabel Data Karyawan
Gambar 56. Hasil perintah HAVING 2

Cobalah kueri di atas pada kotak inputan coba kueri di bawah ini.

Coba Kueri

Hasil

WHERE memfilter sebelum data dikelompokkan, dan HAVING memfilter setelah data dikelompokkan. Sehingga baris yang dihilangkan oleh klausa WHERE tidak termasuk dalam kelompok umur.

Klausa WHERE memfilter semua baris dengan jenis kelamin laki-laki. Data kemudian dikelompokkan berdasarkan umur, dan kemudian klausa HAVING hanya memfilter grup tersebut dengan rata-rata tinggi badannya 170 atau lebih. Tanpa klausa WHERE, maka tidak ada data yang diambil karena rata-rata tinggi untuk setiap umur tanpa melihat jenis kelamin adalah di bawah 170.

Untuk melihat kemampuan menuliskan perintah GROUP BY dengan HAVING dan menerapkannya dalam basis data, silahkan kerjakan latihan di bawah ini.

Latihan HAVING
Soal 1
Instruksi

Lengkapilah kueri di bawah ini dengan mengetikkan jawaban pada kotak inputan yang disediakan. Border kotak inputan berwarna hijau jika jawaban Anda benar dan berwarna merah jika jawaban Anda salah.

Melengkapi Kueri

Perintah: Menampilkan total insentif yang diambil dari kolom insentif, dengan nama kolom alias total_insentif dari tabel dengan nama kinerja, dan kelompokkan berdasarkan kategori_kinerja dengan total_insentif lebih dari 0.

SELECT kategori_kinerja, AS total_insentif FROM kinerja

> 0;

SELECT kategori_kinerja, SUM(insentif) AS total_insentif FROM kinerja

GROUP BY kategori_kinerja

HAVING total_insentif > 0;

Soal 2
Instruksi

Tabel telah tersedia dengan nama


Tampilkanlah total gaji pokok karyawan dengan nama kolom alias total_gapok yang dikelompokkan berdasarkan divisi, dimana nominal total gaji pokok lebih dari 30000000

Hasilnya adalah:

Tabel Data Jabatan
Gambar 57. Hasil perintah GROUP BY dengan HAVING
Kueri

Hasil
Soal 3
Instruksi

Tabel telah tersedia dengan nama


Tampilkanlah total anggaran proyek dengan nama kolom alias total_anggaran yang dikelompokkan berdasarkan status, dimana nominal total anggaran kurang dari 100000000, data diurutkan dari total anggaran yang paling besar

Hasilnya adalah:

Tabel Data Proyek
Gambar 58. Hasil perintah GROUP BY dengan HAVING
Kueri

Hasil

Kamu menjawab dari 3 soal dengan benar!