CrossTab

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
elciodba
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 76
Registrado em: Sex, 31 Out 2008 4:30 pm
Localização: belo horizonte-mg

Selecionar tudo

select numero
      ,codigo
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '01' ,valor )),0)  vencto1
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '02' ,valor )),0)  vencto2 
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '03' ,valor )),0)  vencto3 
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '04' ,valor )),0)  vencto4 
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '05' ,valor )),0)  vencto5       
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '06' ,valor )),0)  vencto6       
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '07' ,valor )),0)  vencto7       
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '08' ,valor )),0)  vencto8       
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '09' ,valor )),0)  vencto9      
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '10' ,valor )),0)  vencto10            
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '11' ,valor )),0)  vencto11                 
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '12' ,valor )),0)  vencto12    
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '13' ,valor )),0)  vencto13                                         
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '14' ,valor )),0)  vencto14                                               
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '15' ,valor )),0)  vencto15                                                     
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '16' ,valor )),0)  vencto16                                                           
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '17' ,valor )),0)  vencto17                                                                 
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '18' ,valor )),0)  vencto18                                                                       
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '19' ,valor )),0)  vencto19                                                                             
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '20' ,valor )),0)  vencto20                                                                       
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '21' ,valor )),0)  vencto21                                                                             
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '22' ,valor )),0)  vencto22                                                                                   
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '23' ,valor )),0)  vencto23                                                                                         
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '24' ,valor )),0)  vencto24                                                                                              
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '25' ,valor )),0)  vencto25                                                                                                    
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '26' ,valor )),0)  vencto26                                                                                                          
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '27' ,valor )),0)  vencto27                                                                                                                
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '28' ,valor )),0)  vencto28                                                                                                                      
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '29' ,valor )),0)  vencto29
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '30' ,valor )),0)  vencto30      
      ,nvl(sum(decode(to_char(vencimento, 'mm'), '31' ,valor )),0)  vencto31            
 from tab1                                  
group by numero,codigo
order by numero
Porem a data de vencimento é diferente uma da outra

esta saindo assim :

Selecionar tudo

       numero   codigo	       valor    vencimento
       ------   -----------    ------
	0015	00000000001	4,54	28/9/2009                     
 	0015	00000000001	4,54	28/10/2009                                            
 	0015	00000000001	4,54	28/11/2009                                            
 	0015	00000000001	4,54	28/12/2009                                            
	0015	00000000001	4,54	28/1/2010 

eu preciso assim :

Selecionar tudo

       numero   codigo	       valor    vencimento  vencimento  vencimento         vencimento  vencimento
                                           28/09     28/10        28/11       28/12      28/01
       ------   -----------    ------   ----------  ----------  ----------  ----------  ----------
	0015	00000000001	4,54	28/9/2009   28/10/2009  28/11/2009  28/12/2009  28/1/2010           



alguém sabe como fazer isso, estou tentando fazer um CROSSTAB mas não esta dando certo

Obrigado
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

A forma como você montou a consulta está quase correta, o problema foi ter feito o pivot com base no mês

Selecionar tudo

decode(to_char(vencimento, 'mm'), '01' ,valor) ... 
Desta forma, as colunas vão ser somadas pelo mês (os vencimentos de Jan/2010 e Jan/2009 ficariam no mesmo campo)

Faltou também colocar o pivot dos vencimentos (só estava sendo feito pela coluna valor)


Se a tabela tiver o número da parcela, basta fazer:

Selecionar tudo

select numero
     , codigo
     , nvl( sum ( decode( num_parcela, 1, valor, null ) ), 0) parcela1
     , max ( decode( num_parcela, 1, vencimento, null ) )     vencimento1
     , nvl( sum ( decode( num_parcela, 2, valor, null ) ), 0) parcela2
     , max ( decode( num_parcela, 2, vencimento, null ) )     vencimento2
     ...
from   tab1
where  numero = 15
and    codigo = '00000000001'
group by numero, codigo
;
Caso não tenha o campo, você só precisa simula-lo com o rownum ou row_number():

Selecionar tudo

select numero
     , codigo
     , nvl( sum ( decode( num_parcela, 1, valor, null ) ), 0) parcela1
     , max ( decode( num_parcela, 1, vencimento, null ) )     vencimento1
     , nvl( sum ( decode( num_parcela, 2, valor, null ) ), 0) parcela2
     , max ( decode( num_parcela, 2, vencimento, null ) )     vencimento2
     , nvl( sum ( decode( num_parcela, 3, valor, null ) ), 0) parcela3
     , max ( decode( num_parcela, 3, vencimento, null ) )     vencimento3
     , nvl( sum ( decode( num_parcela, 4, valor, null ) ), 0) parcela4
     , max ( decode( num_parcela, 4, vencimento, null ) )     vencimento4
     , nvl( sum ( decode( num_parcela, 5, valor, null ) ), 0) parcela5
     , max ( decode( num_parcela, 5, vencimento, null ) )     vencimento5
     , nvl( sum ( decode( num_parcela, 6, valor, null ) ), 0) parcela6
     , max ( decode( num_parcela, 6, vencimento, null ) )     vencimento6
--  ...
from
(
  select numero
       , codigo
       , valor
       , vencimento
       , row_number() over (order by vencimento) num_parcela
  from   tab1
  where  numero = 15
  and    codigo = '00000000001'
)
group by numero, codigo

O resultado seria:

Selecionar tudo

NUMERO  CODIGO       PARCELA1  VENCIMENTO1  PARCELA2  VENCIMENTO2  PARCELA3  VENCIMENTO3  PARCELA4  VENCIMENTO4  PARCELA5  VENCIMENTO5
15      00000000001  4.54      9/28/2009    4.54      10/28/2009   4.54      11/28/2009   4.54      12/28/2009   4.54      1/28/2010  

elciodba
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 76
Registrado em: Sex, 31 Out 2008 4:30 pm
Localização: belo horizonte-mg

Grande amigo Rafael O. Genaro deu certo muito Obrigado, se precisar de alguma coisa é so falar...

Muito obrigado........
elciodba
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 76
Registrado em: Sex, 31 Out 2008 4:30 pm
Localização: belo horizonte-mg

Grande amigo Rafael O. Genaro deu certo muito Obrigado, se precisar de alguma coisa é so falar...

Porem de um problema :

Esta ficando assim :

Selecionar tudo

NUMERO  CODIGO       PARCELA1  VENCIMENTO1  PARCELA2  VENCIMENTO2  PARCELA3  VENCIMENTO3  PARCELA4  VENCIMENTO4  PARCELA5  VENCIMENTO5 
15      00000000001  4.54      28/09/2009    4.54      28/10/2009   4.54      28/11/2009   4.54      28/12/2009   4.54      28/01/2010  
16      00000000002  4.54      10/10/2009    4.54      10/11/2009   4.54      10/12/2009   4.54      10/01/2010   4.54      10/02/2010  

e o certo seria assim o q você acha???

Selecionar tudo

NUMERO  CODIGO       PARCELA1  VENCIMENTO1  PARCELA2  VENCIMENTO2  PARCELA3  VENCIMENTO3  PARCELA4  VENCIMENTO4  PARCELA5  VENCIMENTO5 PARCELA6 VENCIMENTO6
15      00000000001  4.54      28/09/2009    4.54      28/10/2009   4.54      28/11/2009   4.54      28/12/2009   4.54      28/01/2010   
16      00000000002  4.54      10/10/2009    4.54      10/10/2009   4.54      10/11/2009   4.54      10/12/2010   4.54      10/01/2010   4.54    10/02/2010  
você já viu algo amigo de forma???

Obrigado
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Não entendi...
O registro 16 deveria ser duplicado no 1º e 2º vencimentos (10/10/09)? Qual o critério?
elciodba
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 76
Registrado em: Sex, 31 Out 2008 4:30 pm
Localização: belo horizonte-mg

amigo você tem um email para que eu possa mandar uma planilha pra você dar uma olhada

Obrigado
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 16 visitantes