Pivot table bir tablodaki verileri yatay olarak göstermemizi sağlar yani satırlarda bulunan bilgileri istediğimiz alanlara göre sutunlara çevirir. Özellikle rapor hazırlarken verileri daha anlaşılır ve düzenli hale getirmemizi sağlar. Örneğin bir sipariş tablomuz var. Bir müşterinin verdiği her bir sipariş bir satırda gösteriliyor. Her müşteri için son 6 aylık sipariş bilgilerini görmek istiyoruz. Birinci yöntem her hareketi alt alta yazmak olabilir ama daha anlaşılır ve düzenli bir rapor için her müşteri bir satırda yer almalı ve bu satırda son altı aya ait tüm sipariş tutarlarının toplamı gösterilmelidir. Bu durumda pivot table kullanmak imdadımıza yetişir. Bu örneğin daha iyi anlaşılması için küçük bir çalışma yapalım.
İlk olarak basit bir tablo yapalım ve içine aşağıdaki örnek verileri atalım.
CREATE TABLE [dbo].[Siparis]( [SiparisID] [ int ] IDENTITY(1,1) NOT NULL , [MusteriAdSoyad] [ varchar ](80) NULL , [UrunAdi] [ varchar ](50) NULL , [Tutar] [ decimal ](10, 2) NULL , [Donem] [ int ] NULL ) ON [ PRIMARY ] |
SiparisID | MusteriAdSoyad | UrunAdi | TutarDonem |
---|---|---|---|
Sabri KUNT | Apple IPAD | 1025201001 | |
Ali DEMİR | LG Netbook | 950200912 | |
Metin TOSUN | PacketBell Notbook | 1200200911 | |
Sabri KUNT | Nikon D5000 | 1480200912 | |
Sabri KUNT | Microsoft Mouse | 100200912 | |
Metin TOSUN | HP Printer | 250200912 | |
Metin TOSUN | HP Server | 2100200911 | |
Ali DEMİR | HP Pavilion | 1600200912 | |
Ali DEMİR | ADSL Modem | 80200911 |
SELECT MusteriAdSoyad ,Donem , sum (Tutar) as ToplamTutar FROM Siparis group by MusteriAdSoyad ,Donem |
MusteriAdSoyad | Donem | ToplamTutar |
---|---|---|
Ali DEMİR | 200911 | 80 |
Metin TOSUN | 200911 | 3300 |
Ali DEMİR | 200912 | 2550 |
Metin TOSUN | 200912 | 250 |
Sabri KUNT | 200912 | 1580 |
Sabri KUNT | 201001 | 1025 |
Şimdi ise her müşteriyi tek bir satırda gösterelim ve sipariş verdikleri her ay içinde bir kolon açarak bunun altında toplam sipariş tutarlarını gösterelim. Pivot table için Siparis tablosunu gruplayarak kullanmamız gerekiyor. Çünkü sipariş tablosunda her ay için müşteri bazında birden fazla harcama var. Yukarıda yaptığımız gruplamayı yeni bir tablo olarak alıp bunu pivot yaparsak istediğimiz sonuca ulaşabiliriz.
SELECT * FROM ( SELECT MusteriAdSoyad ,Donem , sum (Tutar) as ToplamTutar FROM Siparis group by MusteriAdSoyad ,Donem ) as gTablo PIVOT ( SUM (ToplamTutar) FOR Donem IN ([200911],[200912],[201001]) ) AS p |
MusteriAdSoyad | 200911 | 200912 |
---|---|---|
Ali DEMİR | 80 | 2550 |
Metin TOSUN | 3300 | 250 |
Sabri KUNT | NULL | 1580 |
Gördüğünüz gibi bu şeklide bir tablo oluşturmak sonucun daha düzenli olmasını sağladığı gibi incelenmesini kolaylaştırır.
ORACLE;
SELECT ...
FROM ...
PIVOT [XML]
( pivot_clause
pivot_for_clause
pivot_in_clause )
WHERE ...
SQL> WITH pivot_data AS ( SELECT deptno, job, sal FROM emp ) SELECT * FROM pivot_data PIVOT ( SUM(sal) --<-- pivot_clause="" span=""> FOR deptno --<-- pivot_for_clause="" span=""> IN (10,20,30,40) --<-- pivot_in_clause="" span=""> );-->-->-->
JOB 10 20 30 40 --------- ---------- ---------- ---------- ---------- CLERK 1430 2090 1045 SALESMAN 6160 PRESIDENT 5500 MANAGER 2695 3272.5 3135 ANALYST 6600