Anasayfa / Yazılım / SQL / Toplama Fonksiyonlarının HAVING ile Birlikte Kullanımı

Toplama Fonksiyonlarının HAVING ile Birlikte Kullanımı

Toplama ifadeleri ile Having deyimini birlikte kullanabiliriz. Having deyimi ile belirtmiş olduğumuz toplama işlemi yapacağımız kolonlar sorgumuz sonucunda gösterilmeyebilir bunu arka planda işlem yapma amacı ile kullanırız. Örnepğin diyelim ki, örneğin en az 10 tane sipariş vermiş müşterilerden her birinin kaçar tane sipariş vermek istediğini bulmak istiyoruz ama sonuçlarda en az 10 tane bilgisini değil bunların içinde toplam siparişlerini listelemek istiyoruz. Veya diyelim ki toplamda en az 1000 dolar sipariş yapmış müşterilerin toplam yaptıkları sipariş miktarını bulmak istiyoruz.

HAVING deyiminden sonra toplama fonskiyonu kullanacağımız kolonlar kullanabildiğimiz gibi, toplama fonksiyonu uygulamadığımız kolonları da kullanabiliriz. Söz dizimi olarak aşağıdaki gibi bir yapısı vardır:

SELECT Toplama Fonksiyonu1(kolon1),kolon2 FROM tablo GROUP BY kolon2
HAVING Toplama Fonksiyonu2(kolon3) = karşılaştırılacak değer

Burada = (eşittir), <,> büyüktür küçüktür gibi karşılaştırma operatörleri kullanılabilir, ihtiyaca göre değişir. Şimdi AdventureWorks2012 veritabanı üzerinde bir kaç örnek ile konuya devam ediyorum.

1) Sales.SalesOrderHeader tablosunda Total Due alanı 3000’den fazla olan CustomerID’lerin toplam alışverişini bulacağım.

SELECT CustomerID, SUM(TotalDue) AS "Müşteri Başına Toplam" FROM Sales.SalesOrderHeader
GROUP BY CustomerID HAVING SUM(TotalDue) > 3000

2013031714

2) Bu sorgumda da SELECT listesinin ilk kısmında yer almayan bir toplama ifadesinin (örneğim için COUNT) HAVING ile birlikte nasıl kullanılabileceğini göstermektedir.

SELECT CustomerID, SUM(TotalDue) AS "Müşteri Başına Toplam" FROM Sales.SalesOrderHeader
GROUP BY CustomerID HAVING COUNT(*) = 6 AND SUM(TotalDue) > 3000

2013031715

3) Bu sorgumda HAVING sonrası toplama fonksiyonu uygulanmayan CustomerID kolonu mevcut. Aynı zamanda bu kolon GROUP BY tarafında da kullanılıyor. Burda aslında bir nevi WHERE deyimi kullanıyorum. GROUP BY ile gruplama yapıyorum çünkü.

SELECT CustomerID, SUM(TotalDue) AS "Müşteri Başına Toplam" FROM Sales.SalesOrderHeader
GROUP BY CustomerID HAVING CustomerID > 18572

Müşteri ID’si 18572’den büyük olan müşterilerin yaptıkları toplam alışveriş miktarını Sales.SalesOrderHeader tablosundan çekiyorum.

2013031716

SQL’de kodlarımızı yazarken WHERE mi önce, yoksa HAVING’mi önce çalıştırılır bu konuda hep çekinceye düşeriz. Eğer siz bir toplama işlemi içeren bir sorgu yazdı iseniz sıralama şu şekildedir :

  • SELECT
  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • ORDER BY
  • Veritabanı yönetim sistemi gruplamalardan önce WHERE deyimini çalıştırır. Aslında SELECT zaten listeleme yapar dolayısı ile önce içerideki diğer cümleler aşağıdaki sıralama ile çalışırlar.

  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • ORDER BY
  • SELECT
  • Yani asıl filtre WHERE deyimi ile birlikte yapılır. WHERE deyimi filtreleyi yapar ve diğer fonksiyonlar ile birlikte kullanıldığında önce kendisi çalışır. Eğer sorguda WHERE yok ise HAVING ile de bir nevi filtreleme yapabilirsiniz. Örneğin sadece 2013 yılında yapılan siparişleri listelemek için HAVING fonksiyonu ile birlikte bir karşılaştırma yapabilirsiniz. Veya 5 siparişten az sipariş yapan müşterileri yine HAVING ile de filtreleyebilirsiniz. HAVING ve WHERE birbirine oldukça benzemektedir. Ancak her ikisi eğer bir sorguda kullanılıyor ise önce WHERE çalıştırılır.

    Şimdi HAVING ile alakalı bir kaç örnek daha yapıp, konuyu bitirelim.

    4) Sales.SalesOrderDetail tablosunda SalesOrderID alanına göre DetailLines kolonu değeri 2’den fazla olan verileri listeleyelim.

    SELECT SalesOrderID, COUNT(*) AS "Detaylı Satırlar" FROM Sales.SalesOrderDetail
    GROUP BY SalesOrderID HAVING COUNT(*) > 2

    2013031717

    5) Sales.SalesOrderDetail tablosunda SalesOrderID kolonuna göre gruplayarak LineTotal değeri toplamı 600’den fazla olanların Toplam LineTotal değerini bulalım.

    SELECT SalesOrderID, SUM(LineTotal) AS "Line Total Kolonları Toplamı"
    FROM Sales.SalesOrderDetail GROUP BY SalesOrderID HAVING SUM(LineTotal) > 600;

    2013031718

    6) Production.Product tablosunda ProductModelID gruplarına göre ürün sayısı 2 olanları listeleyelim.

    SELECT ProductModelID, COUNT(*) AS "Ürün Sayısı" FROM Production.Product
    GROUP BY ProductModelID HAVING COUNT(*) = 2;

    2013031719

    7) Bir üstteki sorguya ürün sayısı 1 olanları ve renkleri kırmızı ve mavi olanları listeleyerek devam edelim.

    SELECT ProductModelID, Color, COUNT(*) AS "Ürün Sayısı" FROM Production.Product
    WHERE Color IN ('Red','Blue') GROUP BY ProductModelID, Color HAVING COUNT(*) = 1;

    2013031720

    Bir cevap yazın

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir