- Este tópico contém 5 respostas, 5 vozes e foi atualizado pela última vez 13 anos, 2 meses atrás por rman.
-
AutorPosts
-
7 de novembro de 2011 às 4:56 pm #101508EddyParticipante
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 880Entã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]
7 de novembro de 2011 às 11:47 pm #101511burgaParticipanteSe o número de colunas não é fixo, você só vai conseguir isso com SQL dinâmico e PL/SQL…
8 de novembro de 2011 às 3:58 pm #101516EddyParticipante[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 ajudoucreate 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 n9 de novembro de 2011 às 7:44 pm #101527luiusiqueParticipanteOla 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/2011QUAL 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.
9 de novembro de 2011 às 9:48 pm #101534leandrolbsParticipante@luiusique acho que um simples group by 1,2 já resolve seu problema.
10 de novembro de 2011 às 2:08 am #101541rmanParticipante@luiusique
Seguindo a solução do leandrolbs, temos:
SELECT CODCLIENTE, DATANEGOCIACAO, COUNT(*) TOTAL
FROM TABELA
GROUP BY CODCLIENTE, DATANEGOCIACAO
-
AutorPosts
- Você deve fazer login para responder a este tópico.