-- GROUP BY --
-- SUM, MIN, MAX, AVG ve COUNT Aggregate Fonksiyonlardır. Bunlarla eklediğimiz tüm sütunlardan
-- başka sütunları group by'da yazmamız gerekiyor.
select degerlendiren, COUNT(*) puansayisi from Degerlendirme group by degerlendiren
-- değerlendirenlere göre puan sayıları
select degerlendiren, MAX(puani) maksimumpuan from Degerlendirme group by degerlendiren
-- değerlendirenlere göre maksimum puanlar
select degerlendiren, MIN(puani) minimumpuan from Degerlendirme group by degerlendiren
-- değerlendirenlere göre minimum puanlar
select film_id, MAX(puani) maksimumpuan from Degerlendirme group by film_id
-- filmlere göre maksimum puanlar
select film_id, MIN(puani) minimumpuan from Degerlendirme group by film_id
-- filmlere göre minimum puanlar
select film_id, COUNT(*) puansayisi from Degerlendirme group by film_id
-- filmlere göre puan sayıları
select film_id, (SUM(puani) / COUNT(*)) ortalamapuan from Degerlendirme group by film_id
-- filmlere göre puan ortalamaları
select film_id, AVG(puani) ortalamapuan from Degerlendirme group by film_id
-- filmlere göre puan ortalamaları
select film_id, AVG(CAST(puani as float)) ortalamapuan from Degerlendirme group by film_id
-- filmlere göre puan ortalamaları: doğru sonuç için cast ile veri dönüştürmeye dikkat etmek gerekli!
select f.adi, f.yapimyili, f.gisesi, AVG(CAST(d.puani as float)) ortalamapuan from Film f
left outer join Degerlendirme d on f.id = d.film_id
group by f.adi, f.yapimyili, f.gisesi
-- filmlere göre puan ortalamaları
select f.adi, f.yapimyili, f.gisesi, AVG(CAST(d.puani as float)) ortalamapuan from Film f
left outer join Degerlendirme d on f.id = d.film_id
group by f.adi, f.yapimyili, f.gisesi
having AVG(CAST(d.puani as float)) > 60
-- filmlere göre puan ortalamaları 60'tan büyük olanlar
select f.adi, f.yapimyili, f.gisesi, AVG(CAST(d.puani as float)) ortalamapuan, COUNT(*) puansayisi from Film f
left outer join Degerlendirme d on f.id = d.film_id
group by f.adi, f.yapimyili, f.gisesi
having AVG(CAST(d.puani as float)) > 60 and COUNT(*) > 1
-- filmlere göre puan ortalamaları 60'tan büyük ve puan sayıları 1'den büyük olanlar
-- Soru: Film adları ile oyuncu sayılarını getiren sorgu?
use Filmler
select f.adi as filmadi, COUNT(o.id) as oyuncusayisi
from Film as f inner join FilmOyuncuKarakter as fok on f.id = fok.film_id
inner join Oyuncu as o on fok.oyuncu_id = o.id
group by f.adi
-- Soru: Hangi oyuncu kaç filmde oynamış?
select Oyuncu.id as oyuncuid, Oyuncu.adi as oyuncuadi, Oyuncu.soyadi as oyuncusoyadi,
CONVERT(varchar(10), Oyuncu.dogumtarihi, 104) as oyuncudogumtarihi,
CAST(COUNT(*) as varchar(3)) as oyuncutoplamfilmsayisi
from Oyuncu, FilmOyuncuKarakter, Film
where Oyuncu.id = FilmOyuncuKarakter.oyuncu_id
and FilmOyuncuKarakter.film_id = Film.id
group by Oyuncu.id, Oyuncu.adi, Oyuncu.soyadi, Oyuncu.dogumtarihi
order by oyuncutoplamfilmsayisi
-- Soru: Hangi yönetmen hangi filmle ne kadar gişe hasılatı yapmış?
select y.adi + ' ' + y.soyadi as yonetmen, SUM(f.gisesi) as toplamgise
from Yonetmen as y inner join Film as f on y.id = f.yonetmen_id
group by y.adi, y.soyadi
-- WITH ROLLUP - WITH CUBE --
-- ROLLUP: Gruplanmış kolonların hiyerarşisine göre özet satır oluşturur.
-- GROUP BY deyiminde kullanılmış kolon sayısı kadar gruplama tipi gerçekleştirir.
-- GROUP BY deyiminde verilmiş kolonları sağdan sola doğru gruplar
-- ve ona göre her grubun altında özet satır oluşturur.
-- CUBE: Değerlerin tüm kombinasyonları için ara özet satırı oluşturur.
-- CUBE, ROLLUP gibi özet satırı oluşturur. Tek farkı, GROUP BY deyiminde kullanılmış
-- kolonların değerlerinin bütün kombinasyonları kadar group özeti yapar.
-- NOT: WITH CUBE veya WITH ROLLUP operatörleri aynı anda en fazla 10 kolon (kırılım noktası)
-- üzerinde özetleme yapabilir.
-- Soru: Oyuncu ad ve soyadlarına göre oynadıkları filmlerin toplam gişe hasılatları?
select Oyuncu.adi as oyuncuadi, Oyuncu.soyadi as oyuncusoyadi,
SUM(Film.gisesi) as oynadigifilmlertoplamgisesi
from Oyuncu inner join FilmOyuncuKarakter on Oyuncu.id = FilmOyuncuKarakter.oyuncu_id
inner join Film on FilmOyuncuKarakter.film_id = Film.id
group by Oyuncu.adi, Oyuncu.soyadi
order by Oyuncu.adi
-- WITH ROLLUP'lı hali:
select Oyuncu.adi as oyuncuadi, Oyuncu.soyadi as oyuncusoyadi,
SUM(Film.gisesi) as oynadigifilmlertoplamgisesi
from Oyuncu inner join FilmOyuncuKarakter on Oyuncu.id = FilmOyuncuKarakter.oyuncu_id
inner join Film on FilmOyuncuKarakter.film_id = Film.id
group by Oyuncu.adi, Oyuncu.soyadi with rollup
order by Oyuncu.adi
-- Satır 1'de NULL, NULL, 73600000,00 değerleri dönüyor.
-- Bunun anlamı WITH ROLLUP bize 73600000,00'ı bu değerin olduğu satırın altındaki
-- tüm toplam gise değerlerini toplayıp veriyor.
-- Satır 2'de Carrie, Henn, 10000000,00 değerleri dönüyor.
-- Bunun anlamı WITH ROLLUP bize sadece Carrie Henn'in toplam gişe değerini veriyor.
-- Satır 3'te Carrie, NULL, 10000000,00 değerleri dönüyor.
-- Bunun anlamı WITH ROLLUP bize 10000000,00'ı tüm Carrie isimlerinin toplam gişe
-- değerlerini toplayıp veriyor.
-- Satır 4'te Charles, Dance, 4000000,00 değerleri dönüyor.
-- Bunun anlamı WITH ROLLUP bize sadece Charles Dance'in toplam gişe değerini veriyor.
-- Satır 5'te Charles, Dutton, 4000000,00 değerleri dönüyor.
-- Bunun anlamı WITH ROLLUP bize sadece Charles Dutton'un toplam gişe değerini veriyor.
-- Satır 6'da Charles, NULL, 8000000,00 değerleri dönüyor.
-- Bunun anlamı WITH ROLLUP bize 8000000,00'i tüm Charles isimlerinin toplam gişe
-- değerlerini toplayıp veriyor.
-- Diğer satırlar da Satır 2 ve Satır 3'teki özellikleri gösteriyor.
-- WITH CUBE'lu hali:
select Oyuncu.adi as oyuncuadi, Oyuncu.soyadi as oyuncusoyadi,
SUM(Film.gisesi) as oynadigifilmlertoplamgisesi
from Oyuncu inner join FilmOyuncuKarakter on Oyuncu.id = FilmOyuncuKarakter.oyuncu_id
inner join Film on FilmOyuncuKarakter.film_id = Film.id
group by Oyuncu.adi, Oyuncu.soyadi with cube
order by Oyuncu.adi
-- İlk 17 satır NULL, OyuncuSoyadı, ToplamGişeDeğeri şeklinde dönüyor.
-- Bunun amacı oyuncu soyadlarına göre de özet toplam gişe değerleri toplamı çıkarmak.
-- 18. satır WITH ROLLUP'ın döndürdüğü 1. satırdaki gibi NULL, NULL, ToplamGişeDeğerleriToplamı
-- şeklinde dönüyor.
-- 19. satırdan itibaren WITH ROLLUP'ın 2. satırdan itibaren döndürdüğü gibi değerler dönüyor.
-- SONUÇ:
-- WITH ROLLUP ve WITH CUBE GROUP BY'daki sütun adlarına göre özetlemeler yapar.
-- WITH ROLLUP en sağdaki sütundan en soldaki sütuna doğru özetlemeler yapar.
-- WITH CUBE ise WITH ROLLUP'tan farklı olarak GROUP BY'da kullanılmış sütunlardaki değerlerin
-- tüm kombinasyonları için özetlemeler yapar.
-- Soru: Oyuncu ID, ad ve soyadlarına göre ID'si 4 ve daha küçük olan oyuncuların oynadıkları
-- filmlerin toplam gişe hasılatları?
-- HAVING --
select Oyuncu.id as oyuncuid, Oyuncu.adi as oyuncuadi, Oyuncu.soyadi as oyuncusoyadi,
SUM(Film.gisesi) as oynadigifilmlertoplamgisesi
from Oyuncu inner join FilmOyuncuKarakter on Oyuncu.id = FilmOyuncuKarakter.oyuncu_id
inner join Film on FilmOyuncuKarakter.film_id = Film.id
group by Oyuncu.id, Oyuncu.adi, Oyuncu.soyadi having(Oyuncu.id <= 4)
order by Oyuncu.id
-- Oyuncu ID'si 4 ve daha küçük olan oyuncuların ID, ad ve soyadları ile birlikte
-- oynadıkları filmlerin toplam gişeleri
select Oyuncu.id as oyuncuid, Oyuncu.adi as oyuncuadi, Oyuncu.soyadi as oyuncusoyadi,
SUM(Film.gisesi) as oynadigifilmlertoplamgisesi
from Oyuncu inner join FilmOyuncuKarakter on Oyuncu.id = FilmOyuncuKarakter.oyuncu_id
inner join Film on FilmOyuncuKarakter.film_id = Film.id
where Oyuncu.id <= 4
group by Oyuncu.id, Oyuncu.adi, Oyuncu.soyadi
order by Oyuncu.id
-- having(Oyuncu.id <= 4) : having bir aggregate fonksiyon üzerinden kullanılmadığında where Oyuncu.id <= 4 gibi düşünülebilir.