# PostgreSQL’de COUNT DISTINCT ile CASE WHEN Kullanımı: Tam Bir Rehber
PostgreSQL veritabanınızda farklı koşullara bağlı olarak benzersiz değer sayılarını saymanız mı gerekiyor? Örneğin, bir e-ticaret sitesinde, her kategoride kaç farklı ürün olduğunu veya bir müşteri ilişkileri yönetim sisteminde, her bölgede kaç farklı müşteri temsilcisinin çalıştığını öğrenmek isteyebilirsiniz. İşte tam bu noktada COUNT DISTINCT ve CASE WHEN kombinasyonu devreye giriyor. Bu makale, PostgreSQL’de bu güçlü fonksiyonların nasıl birlikte kullanılacağını, performans optimizasyonunu ve gerçek dünya senaryolarını adım adım açıklayacak.
Öğrenme Yol Haritası:
* Yeni Başlayan: Temel Kavramlar, Basit Kod Örnekleri
* Orta Seviye: Gerçek Hayat Örnekleri, Optimizasyon İpuçları
* İleri Seviye: Performans Analizi, Edge Case’ler ve Karmaşık Sorgu Optimizasyonu
1. Temel Kavramlar: COUNT DISTINCT ve CASE WHEN
COUNT DISTINCT, bir sütündaki benzersiz değerlerin sayısını hesaplamak için kullanılan bir PostgreSQL fonksiyonudur. Örneğin, SELECT COUNT(DISTINCT product_id) FROM products; sorgusu, products tablosundaki farklı ürün kimliklerinin sayısını verir.
CASE WHEN ise koşullu işlemler gerçekleştirmek için kullanılır. Bir koşul doğruysa bir değer, yanlışsa başka bir değer döndürür. Genel yapısı şöyledir:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE result3
END
Bu iki fonksiyonu birleştirerek, farklı koşullar altında benzersiz değerlerin sayısını hesaplayabiliriz.
2. PostgreSQL’de COUNT DISTINCT ile CASE WHEN Nasıl Kullanılır? (Adım Adım)
Bir örnek üzerinden gidelim. urunler adında bir tablomuz olsun ve bu tabloda kategori_id ve urun_adi sütunları bulunsun. Her kategoride kaç farklı ürün olduğunu bulmak için aşağıdaki sorguyu kullanabiliriz:
SELECT
CASE
WHEN kategori_id = 1 THEN 'Elektronik'
WHEN kategori_id = 2 THEN 'Giyim'
WHEN kategori_id = 3 THEN 'Kitap'
ELSE 'Diğer'
END AS kategori_adi,
COUNT(DISTINCT urun_adi) AS farkli_urun_sayisi
FROM
urunler
GROUP BY
kategori_adi;
Bu sorgu, önce CASE WHEN ifadesiyle kategori_id değerlerine göre kategori adlarını belirler. Daha sonra, COUNT(DISTINCT urun_adi) ile her kategori için farklı ürün isimlerinin sayısını hesaplar ve GROUP BY ile kategorilere göre gruplar.
3. Gerçek Hayat Örneği: E-Ticaret Veri Analizi
Bir e-ticaret şirketinde, son bir ayda her ödeme yöntemiyle yapılan kaç farklı sipariş olduğunu bulmak isteyelim. siparisler tablomuzda odeme_yontemi ve siparis_id sütunları bulunmaktadır.
SELECT
odeme_yontemi,
COUNT(DISTINCT siparis_id) AS farkli_siparis_sayisi
FROM
siparisler
WHERE
siparis_tarihi >= NOW() - INTERVAL '1 month'
GROUP BY
odeme_yontemi;
Bu sorgu, son bir aydaki siparişleri filtreler ve her ödeme yöntemi için farklı sipariş sayısını hesaplar. CASE WHEN kullanmadan direkt olarak odeme_yontemi sütununu gruplandırarak benzersiz sipariş sayısını elde ederiz.
4. Performans Optimizasyonu İpuçları
COUNT DISTINCT işlemleri, özellikle büyük tablolarda performans sorunlarına yol açabilir. İşte bazı optimizasyon ipuçları:
* İndeksler: COUNT DISTINCT işlemini uyguladığınız sütundaki bir indeks, sorgu performansını önemli ölçüde artırabilir.
* WHERE koşulları: Sorguya bir WHERE koşulu ekleyerek, COUNT DISTINCT işleminin uygulanacağı satır sayısını azaltabilirsiniz.
* Materyalize Görünümler (Materialized Views): Sıkça kullanılan COUNT DISTINCT sorgularının sonuçlarını önceden hesaplayıp saklamak için materyalize görünümler kullanabilirsiniz. Bu, sorgu performansını önemli ölçüde iyileştirebilir. Fatih Soysal’ın [https://fatihsoysal.com](https://fatihsoysal.com) sitesinde materyalize görünümler hakkında daha fazla bilgi bulabilirsiniz.
* Analitik Fonksiyonlar: Bazı durumlarda, COUNT DISTINCT yerine analitik fonksiyonlar (örneğin, RANK(), DENSE_RANK()) kullanmak daha performanslı olabilir.
5. İleri Seviye Teknikler: Karmaşık Sorgu Örnekleri ve Edge Case’ler
Şimdiye kadar basit örnekler verdik. Ancak, gerçek dünya senaryoları daha karmaşık olabilir. Örneğin, birden fazla koşulu aynı anda değerlendirmeniz veya NULL değerlerle başa çıkmanız gerekebilir.
Örnek olarak, urunler tablosuna bir indirimli_mi sütunu ekleyelim (boolean). İndirimli ve indirimsiz ürünler için ayrı ayrı kategori bazında farklı ürün sayısını bulmak isteyelim:
SELECT
kategori_adi,
indirim_durumu,
COUNT(DISTINCT urun_adi) AS farkli_urun_sayisi
FROM (
SELECT
CASE
WHEN kategori_id = 1 THEN 'Elektronik'
WHEN kategori_id = 2 THEN 'Giyim'
ELSE 'Diğer'
END AS kategori_adi,
CASE
WHEN indirimli_mi THEN 'İndirimli'
ELSE 'İndirimsiz'
END AS indirim_durumu,
urun_adi
FROM
urunler
) AS alt_sorgu
GROUP BY
kategori_adi, indirim_durumu;
Bu sorgu, iki CASE WHEN ifadesini kullanarak kategori ve indirim durumunu belirler ve daha sonra COUNT DISTINCT ile her kombinasyon için farklı ürün sayısını hesaplar. İç içe sorgu kullanımı, okunabilirliği artırır ve sorgu mantığını daha net hale getirir.
6. Performans Analizi ve Optimizasyon Stratejileri
Karmaşık sorguların performansını analiz etmek için PostgreSQL’in sunduğu araçları kullanmalısınız. EXPLAIN ANALYZE komutu, sorgu planını ve yürütme süresini gösterir. Bu bilgiye dayanarak, indeks ekleme, sorgu yeniden yazma veya materyalize görünümler gibi optimizasyon stratejileri uygulayabilirsiniz. Fatih Soysal’ın [https://fatihsoysal.com](https://fatihsoysal.com) sitesinde PostgreSQL performans optimizasyonu hakkında daha fazla kaynak bulabilirsiniz.
7. NULL Değerleri ile Baş Etme
COUNT DISTINCT fonksiyonu, NULL değerleri dikkate almaz. Eğer NULL değerleri de saymak istiyorsanız, COUNT(*) fonksiyonunu kullanabilir veya COALESCE fonksiyonu ile NULL değerlerini bir başka değerle değiştirebilirsiniz.
8. Sonuç
PostgreSQL’de COUNT DISTINCT ve CASE WHEN fonksiyonlarını birlikte kullanarak, farklı koşullara bağlı olarak benzersiz değerlerin sayısını etkili bir şekilde hesaplayabilirsiniz. Bu makalede verilen örnekler ve ipuçları, bu güçlü fonksiyonları verilerinizi analiz etmek ve iş zekası raporları oluşturmak için kullanmanıza yardımcı olacaktır. Ancak, büyük veri kümeleriyle çalışırken performans optimizasyonuna dikkat etmek önemlidir. Uygun indeksleme ve sorgu optimizasyon teknikleri kullanarak, sorgularınızın hızını ve verimliliğini artırabilirsiniz.
Sıkça Sorulan Sorular (SSS):
1. COUNT DISTINCT işlemi çok yavaşsa ne yapmalıyım? İndeksleme, WHERE koşulları ekleme, materyalize görünümler ve analitik fonksiyonlar kullanmayı deneyin.
2. CASE WHEN ifadesinde çok fazla koşul varsa ne olur? Okunabilirliği artırmak için alt sorgular kullanın veya daha karmaşık koşullar için fonksiyonlar tanımlayın.
3. COUNT DISTINCT NULL değerleri sayıyor mu? Hayır, saymıyor. NULL değerleri saymak için COUNT(*) veya COALESCE fonksiyonunu kullanın.
4. COUNT DISTINCT ile hangi veri tiplerini kullanabilirim? Neredeyse tüm veri tipleriyle kullanılabilir.
5. PostgreSQL’de performans optimizasyonu için başka hangi teknikleri kullanabilirim? Fatih Soysal’ın [https://fatihsoysal.com](https://fatihsoysal.com) sitesindeki makaleleri inceleyin.
Yazar: Fatih Soysal