Oracle Pivot – Unpivot – Decode ile Pivot

Oracle Pivot-Unpivot Sorguları :

PIVOT ve UNPIVOT 11G ile gelen iki yeni özelliktir,daha eski versiyonlarda kullanamazsınız.
Daha eski versiyonlarda DECODE ya da CASE kullanarak yapılabilir.Hem PIVOT ile hem de Decode ile PIVOT sorgu oluşturup anlamamız açısından örnek yapalım.

Bir tablo yaratalım ve değer girelim tablomuza..

PIVOT:

CREATE TABLE Sales(customer_id VARCHAR2(10),
product VARCHAR2(10),price NUMBER);
INSERT INTO Sales VALUES('CUS001','Pc',2300);
INSERT INTO Sales VALUES('CUS001','Pc',1750);
INSERT INTO Sales VALUES('CUS002','Tv',3500);
INSERT INTO Sales VALUES('CUS002','Tv',900);
INSERT INTO Sales VALUES('CUS002','Mouse',30);
INSERT INTO Sales VALUES('CUS002','Mouse',45);
INSERT INTO Sales VALUES('CUS003','Iphone',540);
INSERT INTO Sales VALUES('CUS003','Iphone',550);
INSERT INTO Sales VALUES('CUS003','Iphone',500);
INSERT INTO Sales VALUES('CUS003','Tv',5600);
INSERT INTO Sales VALUES('CUS004','Mouse',20);
INSERT INTO Sales VALUES('CUS004','Pc',1300);

Müşteriyi satırda ürünleri sütunda gösterirsek;

SELECT * FROM (SELECT customer_id,product,price from sales)
PIVOT(sum(price) as total FOR (product) IN ('Tv' AS TV,'Pc' AS PC,
'Iphone' AS Iphone,'Mouse' AS Mouse))
ORDER BY 1;

1

Ürün satırda müşteri sütunda gösterirsek;

SELECT * FROM (SELECT customer_id,product,price from sales) 
PIVOT(sum(price) as total FOR (customer_id) IN (‘CUS001′ AS CUS001,
’CUS002′ AS CUS002,’CUS003′ AS CUS003,’CUS004′ AS CUS004)) ORDER BY 1;

oracle pivot unpivot

DECODE ile pivot tablo yapmak (11G öncesi)

Yukarıdaki sorguyu 11G öncesi yaptığımızı düşünürsek aşağıdaki gibi DECODE ile yapabiliriz.

SELECT a.customer_id,
SUM(a.pc) total_pc,
SUM(a.tv) total_tv,
SUM(a.mouse) total_mouse,
SUM(a.Iphone) total_iphone FROM
(SELECT t.customer_id,
DECODE(t.product,'Pc',SUM(t.price),NULL) pc,
DECODE(t.product,'Tv',SUM(t.price),NULL) tv,
DECODE(t.product,'Mouse',SUM(t.price),NULL) Mouse,
DECODE(t.product,'Iphone',SUM(t.price),NULL) Iphone
FROM SALES t GROUP BY t.customer_id,t.product )A
GROUP BY a.customer_id ORDER BY 1;

1

CLOB olarak XML almak için:

SELECT * FROM(SELECT customer_id,product,price FROM sales) 
PIVOT XML(SUM(price) as total_price for 
(product) IN (SELECT distinct product from sales));

4

UNPIVOT:

PIVOT yapılmış tabloyu, sorguyu satır bazına indirir.
Sales_pivot diye bi VIEW yaratalım,sonra da onu UNPIVOT yapalım.

CREATE OR REPLACE VIEW sales_pivot AS
SELECT * FROM (SELECT customer_id,product,price from sales) 
PIVOT(sum(price) as total FOR (product) IN ('Tv' AS tv,'Pc' AS pc,
'Iphone' AS Iphone,'Mouse' AS Mouse));
SELECT * FROM sales_pivot 
UNPIVOT INCLUDE NULLS (price FOR product IN (Tv_total AS 'Tv',
pc_total AS 'Pc',Iphone_total AS 'Iphone',Mouse_total AS 'Mouse'))
ORDER BY 1,2,3;

3

Umarım faydalı olur..

Tagged: , , , , , , , ,

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir