Veri analizi ve raporlamada, çeşitli veri setlerini farklı bakış açılarından değerlendirmek önemlidir. Microsoft SQL Server, bu ihtiyacı karşılamak için güçlü bir araç olan Pivot Table (Çapraz Tablo) özelliğini sunar. Bu blog yazısında, SQL Server’da Pivot Table kullanımının temellerini ve bu özelliği nasıl etkili bir şekilde kullanabileceğimizi ele alacağız.
Pivot Table Nedir?
Pivot Table, verileri özetleyerek ve yeniden şekillendirerek, daha anlaşılır ve okunabilir raporlar oluşturmanıza olanak tanır. Özellikle, büyük veri setlerinden belirli bilgileri hızlıca çıkarmak ve bu bilgileri kolayca analiz edebilmek için kullanılır.
Özellikleri:
- Veri setini dinamik olarak yeniden şekillendirir ve satırları sütunlara dönüştürür.
- Özellikle büyük ve karmaşık veri setlerinde verilerin daha okunabilir ve anlaşılır bir biçime dönüştürülmesini sağlar.
- SQL Server gibi bazı veritabanı yönetim sistemlerinde özelleşmiş bir işlevdir.
SQL Server’da Pivot Table Oluşturma
Pivot Table oluşturmak için PIVOT
operatörünü kullanırız. Bu işlem, satırları sütunlara dönüştürerek verileri yeniden şekillendirir.
Temel Syntax
1 2 3 4 5 6 7 8 9 10 11 |
SELECT non_pivoted_column, [first_pivoted_column] as 'Alias1', [second_pivoted_column] as 'Alias2', ... FROM (SELECT column_to_pivot, non_pivoted_column FROM your_table) as SourceTable PIVOT (aggregate_function(column_to_pivot) FOR column_to_pivot IN ([first_pivoted_column], [second_pivoted_column], ...) ) as PivotTable; |
Örnek Kullanım
Konuyu örneklendirmek adına Northwind veritabanındaki Orders
ve Order Details
tablolarını kullanarak, her müşteri için yıllık sipariş toplamlarını gösteren bir Pivot Table oluşturalım. Örneğimizde, her müşteri için her yılın toplam sipariş miktarını tablosunu ele alalım;
1 2 3 4 5 6 7 8 9 |
SELECT CustomerID, [1996] as '1996', [1997] as '1997', [1998] as '1998' FROM (SELECT o.CustomerID, YEAR(o.OrderDate) as OrderYear, od.Quantity FROM Orders o INNER JOIN [Order Details] od ON o.OrderID = od.OrderID) as SourceTable PIVOT (SUM(Quantity) FOR OrderYear IN ([1996], [1997], [1998]) ) as |
Bu sorguda:
INNER JOIN
ileOrders
veOrder Details
tablolarıOrderID
üzerinden birleştiriliyor.YEAR(o.OrderDate)
ile siparişlerin yılı hesaplanıyor.Pivot
işlemi, herCustomerID
için yıllara göreQuantity
‘nin toplamını hesaplıyor.
Sorgunun sonucunda, her müşteri için 1996, 1997 ve 1998 yıllarında yapılan toplam sipariş miktarları görüntülenecektir.
Bu sorguyu pivot olmadan nasıl yapardık ;
1 2 3 4 5 6 7 8 9 10 11 |
SELECT o.CustomerID, SUM(CASE WHEN YEAR(o.OrderDate) = 1996 THEN od.Quantity ELSE 0 END) as '1996', SUM(CASE WHEN YEAR(o.OrderDate) = 1997 THEN od.Quantity ELSE 0 END) as '1997', SUM(CASE WHEN YEAR(o.OrderDate) = 1998 THEN od.Quantity ELSE 0 END) as '1998' FROM Orders o INNER JOIN [Order Details] od ON o.OrderID = od.OrderID GROUP BY o.CustomerID; |
Karşılaştırma
- Esneklik: Pivot işlevi, belirli bir yapı ve format gerektirirken,
CASE WHEN
veGROUP BY
kullanımı daha esnek ve genel koşullarda uygulanabilir. - Kullanılabilirlik: Pivot işlevi, bazı SQL sistemlerinde özel bir işlev olarak bulunurken, koşullu toplama ve gruplama her SQL veritabanında kullanılabilir.
- Okunabilirlik ve Yazım Kolaylığı: Pivot sorguları, özellikle karmaşık veri dönüşümleri için daha okunabilir ve yazımı daha kolay olabilir. Ancak,
CASE WHEN
ifadeleri, daha spesifik ve özelleştirilmiş durumlar için daha fazla kontrol sağlar.
Her iki yöntemin kullanımı, veritabanı yönetim sisteminizin özelliklerine, veri setinizin karmaşıklığına ve spesifik ihtiyaçlarınıza bağlı olarak değişebilir.