Pivot and Unpivot

Queste parole chiave sono state introdotte in Oracle 11g.

L’operatore UNPIVOT trasforma i dati disposti su una colonna in righe separate. Con questa utility è possibile convertire la visualizzazione dei dati per averli visualizzati su colonne e su righe. In questo esempio parliamo dei prezzi associati a un biglietto:

UNPIVOT :

SELECT * FROM tickets ;

Applicazione dello unpivot: ruotando sulla colonna ticket è possibile vedere il prezzo di apertura e chiusura su righe separate.


SELECT ticket,to_char(ticket_date,'YYYYMMDD')ticket_date,price_type,price
FROM tickets
UNPIVOT ( price
FOR price_type
IN ( opening_price AS 'OPEN',
closing_price AS 'CLOSE') ) ;
Script:
drop table tickets purge
/
CREATE TABLE tickets (
ticket VARCHAR2 (20),
ticket_date DATE,
opening_price NUMBER,
closing_price NUMBER)
/
insert into tickets (ticket, ticket_date, opening_price, closing_price) VALUES (‘ABC214’,SYSDATE, 20, 229);
insert into tickets (ticket, ticket_date, opening_price, closing_price) VALUES (‘CDE215’,SYSDATE-12, 100, 200);
insert into tickets (ticket, ticket_date, opening_price, closing_price) VALUES (‘EFG215’,SYSDATE-200, 110, 121);
insert into tickets (ticket, ticket_date, opening_price, closing_price) VALUES (‘GHM216’,SYSDATE-200, 100, 103);
insert into tickets (ticket, ticket_date, opening_price, closing_price) VALUES (‘MNO216’,SYSDATE-201, 122, 11);
insert into tickets (ticket, ticket_date, opening_price, closing_price) VALUES (‘OPQ217’,SYSDATE-1, 49, 46);
insert into tickets (ticket, ticket_date, opening_price, closing_price) VALUES (‘QRS217’,SYSDATE-4, 55, 23);
insert into tickets (ticket, ticket_date, opening_price, closing_price) VALUES (‘STU218’,SYSDATE, 21, 78);
insert into tickets (ticket, ticket_date, opening_price, closing_price) VALUES (‘UVZ218’,SYSDATE-56, 23, 1);
insert into tickets (ticket, ticket_date, opening_price, closing_price) VALUES (‘ZZZ219’,SYSDATE-55, 80, 38);
COMMIT
/

PIVOT consente di trasformare la visualizzazione dei dati in base a singole righe aggregate in una singola riga. In questo esempio parliamo di uno stadio:

select ring,sector,qty from stadium ;

Il campo ad anello mostra i vari settori presenti al suo interno. Applicando il PIVOT è possibile avere i dati del campo ad anello aggregando la quantità dei singoli settori, la trasformazione permette di ottenere i dati in un’unica riga.


SELECT ring, SUM(DECODE(sector, ‘red’, qty, 0)) AS red_sum_quantity,
SUM(DECODE(sector, ‘green’, qty, 0)) AS green_sum_quantity,
SUM(DECODE(sector, ‘yellow’, qty, 0)) AS yellow_sum_quantity,
SUM(DECODE(sector, ‘blue’, qty, 0)) AS blue_sum_quantity
FROM stadium
GROUP BY ring ORDER BY ring ;

Per creare un set di risultati basato su pivot possiamo attivare le colonne ad anello quindi le righe forniscono un riepilogo per ogni singolo settore, come detto la parola chiave è stata introdotta in Oracle 11g.

SELECT *

FROM (SELECT ring, sector, qty
FROM stadium)
PIVOT (SUM(qty) AS sum_sector FOR (sector) IN (‘red’ AS red, ‘green’ AS green, ‘yellow’ AS yellow, ‘blue’ AS blue)) ;

Possiamo rimuovere la dimensione dell’anello per avere la somma per ogni singolo settore:

Per mostrare il risultato nel metodo di trasposizione:

SELECT *
FROM (SELECT sector, qty
FROM stadium)
PIVOT (SUM(qty) AS sum_sector FOR (sector) IN (‘red’ AS red, ‘green’ AS green, ‘yellow’ AS yellow, ‘blue’ AS blue)) ;
The same result we can get with out pivot option too:
SELECT SUM(DECODE(sector, ‘red’, qty, 0)) AS red_sum_quantity,
SUM(DECODE(sector, ‘green’, qty, 0)) AS green_sum_quantity,
SUM(DECODE(sector, ‘yellow’, qty, 0)) AS yellow_sum_quantity,
SUM(DECODE(sector, ‘blue’, qty, 0)) AS blue_sum_quantity
FROM stadium ORDER BY ring ;

Potrebbero interessarti anche...

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *