Query pivot Oracle SQL

Ho dati in una tabella come visto di seguito:

MONTH VALUE 1 100 2 200 3 300 4 400 5 500 6 600 

Voglio scrivere una query SQL in modo che il risultato sia dato come di seguito:

 MONTH_JAN MONTH_FEB MONTH_MAR MONTH_APR MONTH_MAY MONTH_JUN 100 200 300 400 500 600 

Oracle 9i + supporta:

 SELECT SUM(CASE WHEN t.month = 1 THEN t.value ELSE 0 END) AS JAN, SUM(CASE WHEN t.month = 2 THEN t.value ELSE 0 END) AS FEB, SUM(CASE WHEN t.month = 3 THEN t.value ELSE 0 END) AS MAR, SUM(CASE WHEN t.month = 4 THEN t.value ELSE 0 END) AS APR, SUM(CASE WHEN t.month = 5 THEN t.value ELSE 0 END) AS MAY, SUM(CASE WHEN t.month = 6 THEN t.value ELSE 0 END) AS JUN FROM YOUR_TABLE t 

Elenchi solo due colonne: qualcosa di simile dovrebbe essere raggruppato per anno.

C’è syntax ANSI PIVOT (e UNPIVOT), ma Oracle non l’ha supportato fino a 11g. Prima di 9i, dovresti sostituire le istruzioni CASE con DECODE specifico di Oracle.

Oracle 11g e versioni successive

A partire da Oracle 11g, ora puoi utilizzare l’operatore PIVOT per ottenere quel risultato:

 create table tq84_pivot ( month number, value number ); insert into tq84_pivot values(1, 100); insert into tq84_pivot values(2, 200); insert into tq84_pivot values(3, 300); insert into tq84_pivot values(4, 400); insert into tq84_pivot values(5, 500); insert into tq84_pivot values(6, 600); -- insert into tq84_pivot values(1, 400); insert into tq84_pivot values(2, 350); insert into tq84_pivot values(4, 150); select * from tq84_pivot pivot ( sum (value) as sum_value for (month) in (1 as month_jan, 2 as month_feb, 3 as month_mar, 4 as month_apr, 5 as month_mai, 6 as month_jun, 7 as month_jul, 8 as month_aug, 9 as month_sep, 10 as month_oct, 11 as month_nov, 12 as month_dec) );