
Foto oleh Egor Komarov via Pexels
Kuasai Klausa HAVING di SQL Server: Memfilter Hasil Group Berdasarkan Agregasi
Halo teman-teman Malam Ngoding!
Setelah kita mahir mengelompokkan data menggunakan klausa GROUP BY dalam pembahasan sebelumnya, seringkali muncul kebutuhan yang lebih spesifik: bagaimana jika kita ingin memfilter kelompok-kelompok data tersebut berdasarkan suatu kriteria? Misalnya, Anda ingin melihat hanya kelompok produk yang total penjualannya melebihi angka tertentu, atau daftar cabang yang rata-rata transaksinya di bawah standar. Di sinilah klausa HAVING hadir sebagai solusi elegan yang sering disalahpahami oleh banyak developer pemula.
Mengapa HAVING Dibutuhkan? Masalah yang Diselesaikan
Dalam eksplorasi data, kita mengenal dua jenis filtering utama: filtering baris individual dan filtering kelompok data. Klausa WHERE, yang sudah sangat akrab dengan kita, berfungsi untuk memfilter baris-baris data sebelum proses pengelompokan (GROUP BY) atau agregasi (COUNT, SUM, AVG, dsb.) terjadi. Ini berarti WHERE beroperasi pada data mentah, pada setiap baris sebelum dihitung atau digabungkan.
Namun, bagaimana jika kriteria filter Anda melibatkan hasil dari sebuah fungsi agregat? Contoh: Anda ingin mencari semua departemen yang memiliki lebih dari 10 karyawan, atau semua pelanggan yang telah melakukan pembelian dengan total nilai transaksi di atas Rp 5.000.000. Anda tidak bisa menggunakan WHERE COUNT(karyawan) > 10, karena pada saat WHERE dieksekusi, fungsi agregat seperti COUNT() belum dihitung. WHERE hanya bisa melihat kolom-kolom yang ada pada setiap baris individual.
Inilah masalah krusial yang dipecahkan oleh HAVING. Klausa HAVING dirancang khusus untuk memfilter hasil dari GROUP BY, yang berarti ia beroperasi setelah agregasi dan pengelompokan selesai dilakukan. Dengan kata lain, HAVING memungkinkan kita untuk menerapkan kondisi filter pada nilai-nilai agregat atau pada kolom-kolom yang termasuk dalam klausa GROUP BY setelah data dikelompokkan.
HAVING vs. WHERE: Memahami Perbedaan Fundamental
Mencari jumlah pesanan per pelanggan (tanpa HAVING)
Penting sekali untuk memahami perbedaan antara WHERE dan HAVING karena kesalahan dalam penggunaannya dapat berdampak signifikan pada performa query dan hasil yang Anda dapatkan. Mari kita bedah lebih dalam:
- Waktu Eksekusi:
WHEREdieksekusi sebelumGROUP BYdan fungsi agregat dihitung. Ini memfilter baris data mentah.HAVINGdieksekusi setelahGROUP BYdan fungsi agregat dihitung. Ini memfilter grup data yang sudah terbentuk.
- Kolom yang Dapat Diakses:
WHEREdapat mengakses kolom-kolom individual dari tabel asal.HAVINGdapat mengakses kolom-kolom yang ada dalam klausaGROUP BYdan hasil dari fungsi agregat (misalnyaSUM(kolom_penjualan),COUNT(ID_karyawan)).
- Tujuan:
WHERE: Membatasi baris yang akan dimasukkan ke dalam proses pengelompokan.HAVING: Membatasi grup yang akan ditampilkan dalam hasil akhir.
Bayangkan Anda sedang membuat laporan penjualan. Anda ingin melihat total penjualan per kategori produk, tetapi hanya untuk kategori yang memiliki total penjualan di atas Rp 10.000.000, dan Anda hanya tertarik pada transaksi yang terjadi di tahun 2023. Di sini, memfilter tahun 2023 adalah tugas WHERE (memfilter baris transaksi individual), sedangkan memfilter total penjualan per kategori adalah tugas HAVING (memfilter kelompok kategori).
Sintaks Dasar dan Cara Kerja HAVING
Sintaks umum untuk query yang menggunakan GROUP BY dan HAVING adalah sebagai berikut:
SELECT
kolom_yang_dikumpulkan,
FUNGSI_AGREGAT(kolom_nilai)
FROM
NamaTabel
WHERE
kondisi_filter_baris
GROUP BY
kolom_yang_dikumpulkan
HAVING
kondisi_filter_group
ORDER BY
kolom_atau_agregat;
Penting untuk diingat bahwa urutan klausa dalam query SQL tidak bisa sembarangan. Urutan logisnya adalah: FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY. Ini bukan urutan penulisan yang ketat (SELECT selalu di awal), melainkan urutan logis bagaimana database memproses query Anda.
Contoh Implementasi HAVING dalam SQL Server
Mencari pelanggan dengan lebih dari 2 pesanan (dengan HAVING)
Mari kita gunakan skenario umum. Misalkan kita memiliki tabel Pesanan dengan kolom ID_Pesanan, ID_Pelanggan, TanggalPesanan, dan TotalHarga.
Contoh 1: Mencari Pelanggan dengan Jumlah Pesanan Tertentu
Kita ingin mengetahui pelanggan mana saja yang telah melakukan lebih dari 2 pesanan.
Tanpa HAVING, kita hanya bisa menghitung jumlah pesanan per pelanggan:
Seri Belajar SQL Server:
← Sebelumnya: Mengelompokkan Data dengan GROUP BY
→ Selanjutnya: Fungsi Agregat COUNT SUM AVG MIN MAX (segera terbit)