Bagikan melalui


Menggunakan klausa HAVING dan WHERE dalam kueri yang sama (Alat Database Visual)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Dalam beberapa kasus, Anda mungkin ingin mengecualikan baris individual dari grup (menggunakan WHERE klausa) sebelum menerapkan kondisi ke grup secara keseluruhan (menggunakan HAVING klausa).

HAVING Klausa seperti WHERE klausa, tetapi hanya berlaku untuk grup secara keseluruhan (yaitu, ke baris dalam kumpulan hasil yang mewakili grup), sedangkan WHERE klausul berlaku untuk baris individual. Kueri dapat berisi WHERE klausa dan HAVING klausa. Dalam kasus ini kita dapat:

  • Klausa WHERE diterapkan terlebih dahulu ke baris individual dalam tabel atau objek bernilai tabel di panel Diagram . Hanya baris yang memenuhi syarat dalam klausa WHERE yang akan dikelompokkan.

  • Klausa HAVING kemudian diterapkan ke baris dalam tataan hasil. Hanya grup yang memenuhi kondisi yang HAVING muncul dalam output kueri. Anda hanya dapat menerapkan HAVING klausa ke kolom yang juga muncul di klausa GROUP BY atau dalam fungsi agregat.

Tentukan klausa WHERE dan HAVING pada dua tabel yang digabungkan

Nota

Database yang digunakan dalam artikel ini adalah pubs database, dapat diperoleh dari sampel database Northwind dan pubs untuk Microsoft SQL Server di GitHub.

Misalnya, bayangkan Anda menggabungkan tabel titles dan publishers untuk membangun query yang memperlihatkan harga buku rata-rata untuk sekumpulan penerbit. Anda ingin melihat harga rata-rata hanya untuk sekumpulan penerbit tertentu - mungkin hanya penerbit di negara bagian California. Dan bahkan kemudian, Anda ingin melihat harga rata-rata hanya jika lebih dari $ 10,00.

Anda dapat menetapkan kondisi pertama dengan menyertakan WHERE klausul, yang membuang penerbit apa pun yang tidak berada di California, sebelum menghitung harga rata-rata. Kondisi kedua memerlukan klausul HAVING, karena kondisi didasarkan pada hasil pengelompokan dan peringkasan terhadap data. Pernyataan SQL yang dihasilkan mungkin terlihat seperti ini:

SELECT titles.pub_id, AVG(titles.price)
FROM titles INNER JOIN publishers
   ON titles.pub_id = publishers.pub_id
WHERE publishers.state = 'CA'
GROUP BY titles.pub_id
HAVING AVG(price) > 10;

Di Alat Visual Database SQL Server Management Studio, Anda bisa membuat klausa HAVING dan WHERE di panel Kriteria . Secara default, jika Anda menentukan kondisi pencarian untuk kolom, kondisi tersebut menjadi bagian HAVING dari klausa. Namun, Anda dapat mengubah kondisi menjadi WHERE klausa.

Anda dapat membuat WHERE klausa dan HAVING klausa yang melibatkan kolom yang sama. Untuk melakukannya, Anda harus menambahkan kolom dua kali ke panel Kriteria , lalu menentukan satu instans sebagai bagian HAVING dari klausa dan instans lainnya sebagai bagian WHERE dari klausa.

Tentukan sebuah kondisi WHERE di dalam kueri agregat

  1. Tentukan grup untuk kueri Anda. Untuk detailnya, lihat Baris Grup di Hasil Kueri (Alat Visual Database).

  2. Jika belum ada di panel Kriteria , tambahkan kolom tempat Anda ingin mendasarkan WHERE kondisi.

  3. Kosongkan kolom Output kecuali kolom data adalah bagian dari klausa GROUP BY atau disertakan dalam fungsi agregat.

  4. Di kolom Filter , tentukan kondisinya WHERE . Desainer Kueri dan Tampilan menambahkan kondisi ke HAVING klausa pernyataan SQL.

    Nota

    Kueri yang diperlihatkan dalam contoh untuk prosedur ini menggabungkan dua tabel, titles dan publishers.

    Pada titik ini dalam kueri, pernyataan SQL berisi HAVING klausa:

    SELECT titles.pub_id, AVG(titles.price)
    FROM titles INNER JOIN publishers
        ON titles.pub_id = publishers.pub_id
    GROUP BY titles.pub_id
    HAVING publishers.state = 'CA'
    
  5. Di kolom Kelompokkan Menurut , pilih Di mana dari daftar opsi grup dan ringkasan. Desainer Kueri dan Tampilan menghapus kondisi dari HAVING klausa dalam pernyataan SQL dan menambahkannya ke WHERE klausa.

    Pernyataan SQL berubah untuk menyertakan WHERE klausul sebagai gantinya:

    SELECT titles.pub_id, AVG(titles.price)
    FROM titles INNER JOIN publishers
        ON titles.pub_id = publishers.pub_id
    WHERE publishers.state = 'CA'
    GROUP BY titles.pub_id;