› Fóruns › SQL e PL/SQL › Dúvida Como montar select › Dúvida Como montar select
[quote=”burga”:1hwz9j8p]Se o número de colunas não é fixo, você só vai conseguir isso com SQL dinâmico e PL/SQL…[/quote]
Na verdade o número de colunas é fixo 12.
Para aqueles que estão passando pelo mesmo problema já encontrei a solução.
É o caso de inverter as colunas e linhas no select, não entendi muito bem os comandos deste exemplo a qual encontrei mas consegui adaptar ao meu caso e funcionou muito bem Obrigado pela ajuda segue abaixo o exemplo. Espero que ajude alguém como me ajudou
create table TESTTABLE
(
REVENUE1 NUMBER,
REVENUE2 NUMBER,
REVENUE3 NUMBER,
YEAR DATE
)
insert into testtable (REVENUE1, REVENUE2, REVENUE3, YEAR)
values (100, 200, 300, to_date(’01-01-2009′, ‘dd-mm-yyyy’));
insert into testtable (REVENUE1, REVENUE2, REVENUE3, YEAR)
values (250, 350, 450, to_date(’01-01-2010′, ‘dd-mm-yyyy’));
insert into testtable (REVENUE1, REVENUE2, REVENUE3, YEAR)
values (300, 400, 500, to_date(’01-01-2011′, ‘dd-mm-yyyy’));
WITH cntr AS
(
SELECT LEVEL AS n
FROM dual
CONNECT BY LEVEL <= 4
)
, got_unpivoted_data AS
(
SELECT DENSE_RANK () OVER (ORDER BY t.year) AS c_num
, c.n
, CASE c.n
WHEN 1 THEN TO_CHAR (t.year, 'fmDD-Mon-YYYY')
WHEN 2 THEN TO_CHAR (t.revenue1)
WHEN 3 THEN TO_CHAR (t.revenue2)
WHEN 4 THEN TO_CHAR (t.revenue3)
END AS unpivoted_data
FROM cntr c
CROSS JOIN testtable t
)
SELECT MAX (CASE WHEN c_num = 1 THEN unpivoted_data END) AS JAN_2009
, MAX (CASE WHEN c_num = 2 THEN unpivoted_data END) AS JAN_2010
, MAX (CASE WHEN c_num = 3 THEN unpivoted_data END) AS JAN_2011
FROM got_unpivoted_data
GROUP BY n
ORDER BY n