SQL Server HAVING: Filter Hasil GROUP BY Berdasarkan Agregasi

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)

SELECT ID_Pelanggan, COUNT(ID_Pesanan) AS JumlahPesanan FROM Pesanan GROUP BY ID_Pelanggan;

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:
    • WHERE dieksekusi sebelum GROUP BY dan fungsi agregat dihitung. Ini memfilter baris data mentah.
    • HAVING dieksekusi setelah GROUP BY dan fungsi agregat dihitung. Ini memfilter grup data yang sudah terbentuk.
  • Kolom yang Dapat Diakses:
    • WHERE dapat mengakses kolom-kolom individual dari tabel asal.
    • HAVING dapat mengakses kolom-kolom yang ada dalam klausa GROUP BY dan hasil dari fungsi agregat (misalnya SUM(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)

SELECT ID_Pelanggan, COUNT(ID_Pesanan) AS JumlahPesanan FROM Pesanan GROUP BY ID_Pelanggan HAVING COUNT(ID_Pesanan) > 2;

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)