19 Mayıs 2019 Pazar

GROUP BY + HAVING

Giriş
Having 'in uygulanma sırası şöyle.
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
Açıklaması şöyle.
The HAVING statement is used to filter data after it has been grouped by the GROUP BY statement. 
Açıklaması şöyle.
The HAVING clause always applies to aggregated fields, which is all remaining columns post-aggregation.
Şeklen şöyle

COUNT
Örnek - count > 1
Elimizde şöyle bir tablo olsun.. 
ID_a | ID_b | VAL
1    | 1    | 'a'
1    | 2    | 'b'
1    | 3    | 'a'
2    | 1    | 'a'
2    | 2    | 'c'
3    | 1    | 'c'
4    | 1    | 'c'
5    | 1    | 'b'
6    | 1    | 'e'
Aynı ID_a değerine sahip birden fazla olan ve farklı VAL değeri birden fazla olan sütunları bulmak isteyelim. Şöyle yaparız. Aggregate olarak count() kullanılıyor.
select  ID_a from my_table group by ID_a
  having count(*)>1 
and count(distinct VAL) > 1 
Örnek - count = 6
Şöyle yaparız
SELECT institution_no 
FROM table 
WHERE cred_type in (1,2,3,4,5,6)
GROUP BY institution_no
HAVING COUNT(distinct cred_type) = 6;
Örnek - CTE ile count
CTE ile şöyle yaparız
WITH CTE as ( 
             SELECT DISTINCT institution_no, 
                    cert_type 
             FROM credentialing 
             WHERE cert_type IN (1,2)
             ) 
SELECT institution_no, 
       COUNT(institution_no) 
FROM cte 
GROUP BY institution_no 
HAVING COUNT(institution_no) = 2;
SUM
Örnek
Şöyle yaparız. Aggregate olarak sum() kullanılıyor.
SELECT customer_id,SUM (amount) FROM payment GROUP BY customer_id
HAVING SUM (amount) > 200;
Örnek
Şöyle yaparız
SELECT customer_id, SUM(quantity) AS total_quantity
FROM orders GROUP BY customer_id HAVING SUM(quantity) >= 50;

WHERE yerine HAVING
Şu iki cümle farklı şeylerdir. Bu örnekte her şey aggregate edildikten sonra HAVING ile süzme işlemi yapılıyor.
SELECT id, filedate, SUM(amount)
FROM Sales
GROUP BY id, filedate
HAVING id = 123 AND filedate = '1/1/2018'
Bu örnekte ise önce WHERE ile süzme işlemi yapılıyor ve daha sonra gruplama yapılıyor.
SELECT id, filedate, SUM(amount)
FROM Sales
WHERE id = 123 AND filedate = '1/1/2018'
GROUP BY id, filedate

Hiç yorum yok:

Yorum Gönder