SQL veritabanlarında çalışırken, verileri analiz etmek ve raporlamak için esnek çözümler geliştirmek her zaman önemlidir. Bu noktada, SQL'in sunduğu güçlü araçlardan biri olan CASE ifadesi devreye girer. Farklı koşullara bağlı olarak veri dönüştürme ve gruplama imkanı sağlayan CASE ifadesi, veri analiz süreçlerinizi daha verimli hale getirir. Bu yazımızda, CASE ifadesinin temel kullanım alanlarını örneklerle açıklayarak nasıl daha etkili SQL sorguları yazabileceğinizi göstereceğiz.
CASE İfadesini Kullanma
CASE ifadesi, SQL sorgularında belirli koşullara göre farklı sonuçlar döndürmemizi sağlayan bir yapıdır. Basitçe söylemek gerekirse, bir sütundaki değeri kontrol eder ve belirlediğimiz kurallara göre o değeri dönüştürür. Örneğin, bir sipariş tutarına bakarak 'Büyük', 'Orta' veya 'Küçük' gibi kategorilere ayırabiliriz. Bu sayede verileri daha anlamlı gruplara ayırmak veya dinamik sorgular oluşturmak kolaylaşır.
Ayrıca CASE ifadesi, aynı anda birden fazla koşulu değerlendirebilir ve her bir koşula göre farklı sonuçlar üretebilir. Bu da onu oldukça esnek ve güçlü bir araç yapar. Farklı veri türleriyle çalışırken veya verileri gruplamak, sıralamak ve güncellemek gerektiğinde oldukça işe yarar. SELECT, ORDER BY, UPDATE ve HAVING gibi SQL ifadelerinde rahatlıkla kullanılabilir.
Şimdi, SELECT, ORDER BY, UPDATE ve HAVING ifadelerinde CASE ifadesinin nasıl kullanılacağını gösteren birkaç örneği inceleyeceğiz.
Not: Örnekleri uygulayabilmek için bilgisayarınızda Azure Data Studio veya SQL Server Management Studio (SSMS) kurulu olmalıdır. Ayrıca WideWorldImportersDW veritabanını geri yüklemeniz (restore) gerekmektedir. Bu işlemi gerçekleştirmek için WideWorldImportersDW (.bak) dosyasını bilgisayarınıza indirmek için buraya tıklayabilirsiniz.
SELECT Sorgularında Basit CASE İfadesinin Kullanımı
Aşağıda, CASE ifadesinin en temel kullanım örneğini inceleyeceğiz. Bu örnek, yalnızca tek bir alanın kontrolüne dayanıyor:
CASE ifadesiyle yeni bir sütun olan BinLocationDetailed oluşturacağımızı düşünelim. Amacımız, Bin Location sütunundaki değerlere göre bu yeni sütunda daha açıklayıcı bilgiler göstermek. Bin Location değeri 'L-1' ise 'AltSeviye1', 'L-2' ise 'AltSeviye2', 'L-3' ise 'AltSeviye3' olarak atanacak. Eğer değer bu koşullardan hiçbirine uymuyorsa, varsayılan olarak 'Bilinmiyor' gösterilecek.
SELECT TOP(3) [Stock Holding Key], [Bin Location], [BinLocationDetailed] =
CASE [Bin Location]
WHEN 'L-1' THEN 'AltSeviye1'
WHEN 'L-2' THEN 'AltSeviye2'
WHEN 'L-3' THEN 'AltSeviye3'
ELSE 'Bilinmiyor'
END,
[Target Stock Level]
FROM [Fact].[Stock Holding]
Sorguda kullandığımız ELSE ifadesi, koşullardan hiçbirine uymayan durumlar için varsayılan bir değer döndürür. Bu da, belirtilen koşullara uymayan tüm değerler için tek bir sonuç sağlar.
CASE İfadesiyle Siparişleri Tutarlarına Göre Gruplandırma
Bu örnekte, siparişlerin tutarına göre farklı kategorilere ayırmak için CASE ifadesini kullanacağız. Amacımız, Total Excluding Tax sütunundaki değerlere bakarak siparişleri 'Çok Büyük', 'Büyük', 'Orta' ve 'Küçük' olarak sınıflandırmak.
SELECT TOP(3) [Order Key], [WWI Order ID], [Total Excluding Tax],
CASE
WHEN [Total Excluding Tax] >= 1500 THEN 'Çok Büyük'
WHEN [Total Excluding Tax] >= 500 AND [Total Excluding Tax] < 1500 THEN 'Büyük'
WHEN [Total Excluding Tax] >= 100 AND [Total Excluding Tax] < 500 THEN 'Orta'
ELSE 'Küçük'
END AS [Satış Boyutu]
FROM [Fact].[Order]
Bu örnekte, CASE ifadesiyle oluşturduğumuz sütunun ismini belirtmek için 'END AS' ifadesini kullandık.
ORDER BY ile Koşullu Sıralama Yapmak için CASE Kullanımı
Bu örnekte, ORDER BY ifadesi içinde CASE ifadesini kullanarak verileri belirli koşullara göre sıralayacağız. Amacımız, çalışanları satış temsilcisi olup olmamalarına göre iki gruba ayırmak ve her grup için farklı sıralama kuralları uygulamak. Bu sayede sıralama işlemi daha esnek ve amaca uygun hale gelir.
SELECT TOP (1000) [Employee Key], [WWI Employee ID], [Employee], [Is Salesperson]
FROM [Dimension].[Employee]
WHERE [Valid To] >= GETDATE() AND [Employee Key] <> 0
ORDER BY
CASE WHEN [Is Salesperson] = 0 THEN [Employee Key] END ASC,
CASE WHEN [Is Salesperson] = 1 THEN [WWI Employee ID] END DESC
CASE İfadesiyle Koşullu Güncelleme
Bu örnekte, CASE ifadesini kullanarak veritabanındaki kayıtları koşullara göre güncelleyeceğiz. Amacımız, State Province sütunundaki değerlere bakarak Sales Territory sütununa uygun bölge adlarını atamak. Örneğin, eyalet 'New York' ise satış bölgesi 'Doğu Kıyısı' olarak güncellenecek. Bu yöntemle veriler üzerinde dinamik ve esnek güncellemeler yapabiliriz:
UPDATE [Dimension].[City]
SET [Sales Territory] =
CASE
WHEN [State Province] = 'New York' THEN 'Doğu Kıyısı'
WHEN [State Province] = 'Illinois' THEN 'Ortabatı'
WHEN [State Province] = 'Missouri' THEN 'Ortabatı'
END
WHERE [State Province] IN ('New York', 'Illinois', 'Missouri')
HAVING CASE İfadesiyle Gruplandırılmış Verileri Filtreleme
Bu örnekte, CASE ifadesini kullanarak gruplandırılmış verileri filtreleyeceğiz. Amacımız, müşterilerin toplam harcamalarına göre 'Yüksek', 'Orta' ve 'Düşük' harcama grupları oluşturmak ve sadece 'Yüksek' harcamaya sahip olanları listelemek. Bu sayede verileri daha anlamlı kategorilere ayırabilir ve belirli grupları hedef alarak analiz yapabiliriz:
SELECT TOP(20) [Customer Key], SUM([Total Excluding Tax]) AS [Müşteri Toplam Harcama]
FROM [Fact].[Transaction]
WHERE [Customer Key] <> 0
GROUP BY [Customer Key]
HAVING CASE
WHEN SUM([Total Excluding Tax]) >= 150000 THEN 'Yüksek'
WHEN SUM([Total Excluding Tax]) >= 10000 AND SUM([Total Excluding Tax]) < 150000 THEN 'Orta'
ELSE 'Düşük'
END = 'Yüksek'
ORDER BY [Müşteri Toplam Harcama] ASC
Elbette, HAVING koşulunda kullanılan CASE ifadesiyle aynı mantık, bir SELECT ifadesi içinde yer alan SUM ve GROUP BY ifadeleriyle de uygulanabilir.
SELECT TOP(20) [Customer Key],
[Customer Total Spending],
[Spending Group]
FROM (
SELECT [Customer Key],
SUM([Total Excluding Tax]) AS [Customer Total Spending],
CASE
WHEN SUM([Total Excluding Tax]) >= 150000 THEN 'Yüksek'
WHEN SUM([Total Excluding Tax]) >= 10000 AND SUM([Total Excluding Tax]) < 150000 THEN 'Orta'
ELSE 'Düşük'
END AS [Spending Group]
FROM [Fact].[Transaction]
WHERE [Customer Key] <> 0
GROUP BY [Customer Key]
) AS CustomerGroup
WHERE [Spending Group] = 'Yüksek'
ORDER BY [Customer Total Spending] ASC
Görüldüğü gibi, CASE ifadesini kullanmanın iki yöntemi de aynı sonucu verir. HAVING koşulunu kullanmak, okunabilirlik açısından daha avantajlıdır.
CASE ifadeleri, verileri gruplarken koşulları doğrudan sorguya eklememizi sağlar. Bu sayede, veritabanında ekstra bir sütun oluşturmaya gerek kalmadan verileri dinamik olarak gruplandırabiliriz. Bu yöntem, raporları daha hızlı ve esnek bir şekilde oluşturmayı kolaylaştırır.
SQL Server HAVING Koşulu Hakkında Daha Fazla Bilgi için tıklayınız.
Yorumlar