Pular para o conteúdo
Visualizando 6 posts - 1 até 6 (de 6 do total)
  • Autor
    Posts
  • #101508
    Eddy
    Participante

      Olá pessoal, venho com uma dúvida de como montar um select que preciso para um grid, as informações não estão difíceis de encontrar o problema é que quando eu deveria trazer em linhas necessito trazer em colunas e quando preciso trazer em colunas preciso em linha, vou tentar explicar tudo que preciso antes disso a estrutura.

      create table PONTO_EQUILIBRIO
      (
      ID NUMBER(10) not null,
      DT_INI DATE not null,
      DT_FIM DATE not null,
      RESULTADO NUMBER(17,2) NOT NULL
      )

      create table PONTO_EQUILIBRIO_CHECK
      (
      ID NUMBER(10) not null,
      ID_PONTO_EQUI NUMBER(10) not null,
      VLR1 NUMBER(17,2) default 0 not null,
      VLR2 NUMBER(17,2) default 0 not null,
      VLR3 NUMBER(17,2) default 0 not null,
      VLR4 NUMBER(17,2) default 0 not null
      )

      Então preciso trazer em forma de colunas os registros da tabela PONTO_EQUILIBRIO em forma de colunas diferenciando pela data pelo campo dt_ini sendo Mês/Ano cada coluna.
      E como linhas de registro necessito trazer todos os campos que preciso da tabela PONTO_EQUILIBRIO_CHECK que são VLR1,VLR2,VLR3,VLR4 respectivos do Mês do ponto de equilibrio
      Preciso que fique mais ou menos Assim

        |Fev/2011 Jan/2011 Dez/2010
        VLR1 |2000 550 900
        VLR2 |3000 880 660
        VLR3 |4000 2500 710
        VLR1 |5000 2600 880

      Então é isso já pesquisei alguns comandos que pudessem me ajudar como o Decode mas só consegui trazer 1 campo quando eu precisava trazer quantos necessitava segue o exemplo que tentei

      select decode(dt,to_date(’01/11/2011′,’dd/MM/YYYY’),vlr1,null) as Fev_2011
      from
      (
      select ch.vlr1 as vlr1, ch.vlr2 as vlr2, l.dt_ini as dt from ponto_equilibrio_check ch
      inner join ponto_equilibrio l on l.id = ch.id_ponto_equi
      )

      Esse é meu caso não estou pedindo que resolvam para mim e sim somente se puderem me mandar um exemplo para o meu caso, ou os comandos que preciso fazer ou a forma que for, agradeço desde já a atenção de todos[/list]

      #101511
      burga
      Participante

        Se o número de colunas não é fixo, você só vai conseguir isso com SQL dinâmico e PL/SQL…

        #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

          #101527
          luiusique
          Participante

            Ola pessoal estou com a seguinte dificuldade tenho uma base com as seguintes colunas

            CodCliente DatadeNegociacao
            111 1/10/2011
            123 1/10/2011
            111 1/10/2011
            545 1/10/2011
            151 2/10/2011
            143 2/10/2011
            111 3/10/2011
            545 3/10/2011

            QUAL MEU PROBLEMA: TENHO QUE SOMAR A QUANTIDADE DE CLIENTES DIFERENTES QUE REALIZARAM COMPRAS NO PERIODO. O LANCE E O SEGUINTE NESTE EXEMPLO MESMO O CLIENTE 111 REALIZOU 2 COMPRAS NOS DIA 1/10/2011 E PRESCISO QUE CONTE APENAS 1 COMPRA POR DIA POR CLIENTE.

            #101534
            leandrolbs
            Participante

              @luiusique acho que um simples group by 1,2 já resolve seu problema.

              #101541
              rman
              Participante

                @luiusique

                Seguindo a solução do leandrolbs, temos:


                SELECT CODCLIENTE, DATANEGOCIACAO, COUNT(*) TOTAL
                FROM TABELA
                GROUP BY CODCLIENTE, DATANEGOCIACAO

              Visualizando 6 posts - 1 até 6 (de 6 do total)
              • Você deve fazer login para responder a este tópico.
              plugins premium WordPress