Pular para o conteúdo

Fóruns SQL e PL/SQL Dúvida Como montar select Dúvida Como montar select

#101516
Eddy
Participante

    [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