Kurs
Bir veri kümesinden raporlar oluşturmak, veriyle çalışıyorsanız temel bir beceridir. Çünkü nihayetinde, elinizdeki verileri kullanarak kritik iş sorularını yanıtlayabilmek istersiniz. Çoğu zaman bu yanıtlar rapor grafikleri şeklinde sunulur. Ancak bazen tablo biçiminde raporlar da gerekir. Her iki durumda da verileri basit hesaplamalarla özetlemeniz gerekebilir. SQL’de, verileri toplama (aggregate) fonksiyonları ile özetleyebilirsiniz. Bu fonksiyonlarla şu tür soruları yanıtlayabilirsiniz:
some_column_from_the_tableiçin maksimum değer nedir? veyaanother_column_from_the_tablegöz önünde bulundurulduğundasome_column_from_the_tablesütununun minimum değerleri nelerdir?
ve daha fazlası.
Hadi bazı veri toplama işlemleri yapmaya başlayalım.
Not: Bu eğitimi takip edebilmek için PostgreSQL’de (RDBMS olarak bunu kullanacaksınız) temel sorgular yazmayı bilmeniz gerekir. Bu eğitim iyi bir hatırlatma olabilir.
Veritabanının Kurulumu
Önce bir PostgreSQL veritabanı kuralım ve bu eğitimde kullanacağınız tabloyu içeren bu yedeği geri yükleyelim. PostgreSQL’de bir veritabanı yedeğinin nasıl geri yükleneceğini öğrenmek isterseniz, bu eğitimin ilk bölümünü takip edebilirsiniz.
Yedeği geri yükleyebildiyseniz, veritabanında international_debt adında bir tablo görmelisiniz (eğer yoksa önce bir veritabanı oluşturmanız gerekecek). Tabloyun ilk birkaç satırına hızlıca göz atalım (basit bir select sorgusu bunu yapmanızı sağlayacaktır):

Tablo, dünyadaki farklı ülkelerin bu yıla ait çeşitli kategorilerdeki borç istatistiklerine ilişkin bilgileri içerir (indicator_name ve indicator_code sütunlarına bakın). debt sütunu, belirli bir ülkenin belirli bir kategoride sahip olduğu borç miktarını (USD cinsinden) gösterir. Veriler ekonomi alanına aittir ve farklı ülkelerin ekonomik durumlarını analiz etmek için sıklıkla kullanılır. Veriler Dünya Bankası’ndan toplanmıştır.
Artık veritabanını başarıyla kurduğunuza göre, veri hakkında daha fazla bilgi edinmek için bazı basit sorgular çalıştıralım. pgAdmin aracını açın ve başlayın.
Basit Bilgiler Önemlidir
Yukarıdaki görselden, tek bir ülke için fakat farklı kategorilerde birçok yinelenen kayıt olduğunu görebilirsiniz. Buradan hızla şu soru ortaya çıkar:
Tabloda kayıtları bulunan farklı ülkeler hangileridir?
Sadece country_name sütunuyla bir select sorgusu çalıştırırsanız, sorgunun sonucu yinelenen değerler içereceği için bu soruya doğru yanıtı alamazsınız. Bunu önlemek için DISTINCT anahtar sözcüğünü kullanalım.
select distinct country_name from international_debt;
Ve bu, şöyle bir sonuç döndürmelidir:

Artık yukarıdaki soruya makul bir yanıtınız var. Toplama fonksiyonlarına geçmeden önce son bir soru:
Tabloda kaç farklı türde borç göstergesi (indicator) var?
Bunu yanıtlayacak sorgu yukarıdakine benzer olmalı. Yalnızca sütun adını değiştirmeniz yeterli. Bunu bir alıştırma olarak alın, olur mu? Sonuç aşağıdakine benzer olmalıdır:

Toplama (Aggregate) Fonksiyonları
Bir toplama fonksiyonu içeren bir sorgu çalıştırarak başlayalım ve buna göre ilerleyelim. Bu süreçte, SQL’de toplama fonksiyonlarını uygularken kullanmanız gereken sözdizimlerini ve yapıları öğreneceksiniz.
select sum(debt) from international_debt;
Ve sonuç:

SUM() toplama fonksiyonu ile (sayısal değerler içeren) bir sütun boyunca aritmetik toplamı hesaplayabilirsiniz. Yukarıdaki sorgu ile tabloda listelenen ülkelerin toplam bekleyen borcunu öğrenmiş oldunuz.
Not edin ki SUM() toplamı hesaplarken NULL değerleri dikkate almaz. Şimdi şu sorunun cevabını bulalım:
Maksimum borç tutarı nedir?
İmdada yetişen fonksiyon: MAX():
select max(debt) from international_debt;
Ve cevap:

SUM() fonksiyonunda olduğu gibi, MAX() da hesaplama yaparken NULL girdileri dikkate almaz. Benzer bir MIN() fonksiyonu da vardır. debt sütununun minimum değerini Yorumlar bölümünden benimle paylaşır mısınız? Şimdiye kadarki sonuçların doğru olduğundan emin olmak için debt sütununda geçersiz bir kayıt olup olmadığını kontrol etmek iyi bir fikir olacaktır.
Not edin: Bu fonksiyonları yukarıda gösterildiği gibi küçük harfle de kullanabilirsiniz.
Şu sorguyu çalıştırdığınızda: select * from international_debt where debt is null;, boş bir sonuç almalısınız. Şimdi tabloda bulunan farklı ülke sayısının toplamını bulalım.
select count(distinct(country_name)) from international_debt;
Ve görüyorsunuz ki tabloda toplam 124 farklı ülke var. Yukarıdaki sorguda uyguladığınız fonksiyon sıralamasına dikkat edin. Evet, bu şekilde, yani birden fazla toplama fonksiyonunu mantıklı bir biçimde birbirine bağlamak mümkündür.
Diyelim ki debt sütununun ortalama değerini görmek istiyorsunuz. Fonksiyon AVG()’dir:
select avg(debt) from international_debt;
Değerin 1306633214.966397971 (USD) olduğunu görürsünüz. Bu sonuçları uygun sütun adlarıyla sunmak iyi bir fikirdir. Yukarıdaki sonuçlardan, PostgreSQL’in döndürülen sonuçta sütun adını (sorguda yer alan) toplama fonksiyonunun adı olarak değiştirdiğini görebilirsiniz. Bu nedenle, bu sütunlara uygun bir takma ad (alias) vermek iyi olur. Bunu şu şekilde yapabilirsiniz:
select avg(debt) as Average_Debt_By_A_Country from international_debt;
Sonuç çok daha anlaşılırdır:

Şimdi bunu biraz daha karmaşıklaştıralım. another_column_from_the_table sütununa göre some_column_from_the_table sütununun minimum değerleri nelerdir? gibi soruları yanıtlayabilmek için bir toplama fonksiyonunu GROUP BY ifadesiyle eşleştirmeniz gerekir. Nasıl yapacağımıza bakalım.
Toplama Fonksiyonları + GROUP BY + daha fazlası
Diyelim ki bir rapor üretmek istiyorsunuz ve bu raporda country_name ile borçlarının toplamını göstereceksiniz. Örnek aşağıdaki gibidir:

Bu tür raporlar gerçek dünyada oldukça sık kullanılır. Peki böyle bir raporu elde etmek için sorgu nasıl olmalı? debt üzerinde SUM() fonksiyonunu kullanmanız gerekecek. Ayrıca toplam borçla birlikte country_name’i de göstermeniz gerekir. Şu sorguyu çalıştıralım:
select country_name, sum(debt) from international_debt;
Aşağıdaki hatayı üretmiyor mu?
ERROR: column "international_debt.country_name" must appear in the GROUP BY clause or be used in an aggregate function
Şimdi bunun gerçekte ne anlama geldiğini anlayalım. Bir toplama fonksiyonu (ör. SUM()) ile country_name gibi toplanmamış (unaggregated) bir sütunu kullanıyorsanız, bu toplanmamış sütunu bir GROUP BY ifadesine dahil etmeniz gerekir. Dolayısıyla doğru sorgu şöyle olacaktır:
select country_name, sum(debt) as total_debt from international_debt group by country_name;
Ve sonuç tam da istediğimiz gibidir:

Not sorguda takma ad (alias) kullanımına dikkat edin.
Şimdi, bu raporu total_debt sütununa göre azalan şekilde sıralamanız gerektiğini varsayalım. ORDER BY ifadesini hatırladınız mı? Evet, toplama fonksiyonlarını ORDER BY ile de birlikte kullanabilirsiniz:
select country_name, sum(debt) as total_debt from international_debt
group by country_name order by total_debt desc;
Sonuç şimdi ters sıralanmış olmalıdır:

Not ORDER BY ifadesinde kullandığınız sütuna dikkat edin.
Şimdi başka önemli bir soru:
Farklı kategoriler arasında (ters sıralı şekilde) en yüksek borç tutarı nedir?
Burada MAX() fonksiyonunu kullanmanız gerekecek. Bu soruyu yanıtlayacak sorguyu artık zorlanmadan yazabilirsiniz.
select indicator_code, max(debt) as maximum_debt from international_debt
group by indicator_code order by maximum_debt desc;
Ve temiz bir rapor alırsınız:

Bu tür raporlarda satır sayısını da sınırlayabilirsiniz. Diyelim ki yukarıdaki raporda yalnızca ilk beş kaydı dahil etmek istiyorsunuz. Bunu LIMIT ifadesini kullanarak yapabilirsiniz.
select indicator_code, max(debt) as maximum_debt from international_debt
group by indicator_code order by maximum_debt desc
limit 5;
Bu eğitimin son raporu zamanı. Yukarıdaki rapora ülkelerin adlarını da eklemeniz gerekiyor. Bunu nasıl yapabilirsiniz? Aşağıdaki sorgu bunu yapmanızı sağlayacaktır:
select country_name, indicator_code, max(debt) as maximum_debt from international_debt
group by country_name, indicator_code order by maximum_debt desc;
Bir başka güzel rapor:

Yukarıdaki sorguda, SELECT ifadesinden sonra country_name sütununu eklediniz ve ayrıca GROUP BY sonrasına da eklediniz. Bu formatı istediğiniz kadar sütuna genişletebilirsiniz.
Bu tür raporları üretirken GROUP BY, ORDER BY ve LIMIT sırası çok önemlidir. Sırayı yanlışlıkla değiştirirseniz hatalarla karşılaşırsınız. Bunu kendiniz görün:
select country_name, sum(debt) as total_debt from international_debt
order by total_debt desc group by country_name;
Ve şu sonucu alırsınız:
ERROR: syntax error at or near "group"
LINE 1: ... from international_debt order by total_debt desc group by c...
Yukarıdaki sorguda ORDER BY ifadesini GROUP BY’dan önce yerleştirdiniz; bu kabul edilebilir değildir. Aslında, toplama fonksiyonlarını kullanmıyorken de uygulanamaz. Doğru sıra şudur: GROUP BY -> ORDER BY -> LIMIT. Bunu her zaman hatırlayın.
Bir Sonraki Adımlar
Tebrikler! Bu eğitimin sonuna geldiniz. Bu eğitimde PostgreSQL’deki farklı toplama fonksiyonlarını ve bunları kullanarak nasıl faydalı raporlar üreteceğinizi öğrendiniz. Bunlar bir veri bilimci için gerçekten kritik becerilerdir. SQL becerilerinizi sistematik biçimde ilerletmek için aşağıdaki DataCamp kurslarını alabilirsiniz:
