Consulta em duas colunas - Oracle

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
ivan.vergil
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Seg, 06 Jul 2015 9:50 am

Olá, bom dia.
Sou novo aqui no Clube do Hardware e estou com um problema de consulta no Oracle.
Tentei diversas formas com inner join, porém não tive sucesso.

Seguinte, existe a tabela "Tabela1". Preciso separar em um select a sequencia dela em duas colunas.
Tem casos que terá o número impar de sequencias e tem caso que terá o numero par.
Exemplo_1 (impar): Sequencia 1,2,3,4 e 5 (total 5rows)
Como preciso que seja apresentado:

Coluna_1 Coluna_2
1 4
2 5
3
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

Exemplo_2 (par): Sequencia 10,11,12,13:

Coluna_1 Coluna_2
10 12
11 13
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

Exemplo_2 consegui fazer funcionar certinho, conforme select abaixo... porém quando é impar não serve, pois acaba gerando um novo valor para coluna B.

_ _ _ _
SELECT a.nr_sequencia, b.nr_sequencia
FROM (SELECT nr_sequencia FROM cm_conjunto_cont WHERE Mod(nr_sequencia,2) = 1) a
INNER JOIN
(SELECT nr_sequencia FROM cm_conjunto_cont WHERE Mod(nr_sequencia,2) = 0 ) b
ON a.nr_sequencia+1 = b.nr_sequencia
WHERE a.nr_sequencia IN (256243,256244,256245,256246)
_ _ _ _


Alguém consegue dar um help?
Obrigado !
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Bem, entendi sua necessidade, porém deu uma requintada para atender mais genericamente.
Do jeito que realizei a sequencia ordenada pode ter "furos" de valores. Pode ser (10,11,15,16,17). que ainda vai ordenar por coluna até a metade dos valores e a outra metade na outra coluna.

A primeira consulta é apenas para gerar a sequência e ordenar, onde será substituída apenas pela tabela necessitada.

Selecionar tudo

/* EXEMPLO DE DADOS */
WITH seq as(
SELECT x.valor
     , rownum linha
     , COUNT(1) OVER() TOTAL
  FROM (SELECT NUM_INI + LEVEL - 1 VALOR
          FROM (SELECT &val_ini NUM_INI FROM dual)
        CONNECT BY LEVEL <= &val_fim - &val_ini + 1) x 
order by 1        
        ),
/* Trata valores para ajudar entendimento */        
trata as (        
select s.valor
     , s.linha  
     , s.total
     , CEIL(s.total/2) MEIO
     , Mod(linha -1 ,CEIL(s.total/2)) lin
     , CEIL(linha/ (CEIL(s.total/2))) coluna
  from seq s)
/* Consulta final*/  
select t1.valor , t2.valor
  from trata t1
  left join trata t2 on (t1.lin    = t2.lin
               AND t1.coluna = t2.coluna -1)
 where t1.linha <= t1.meio
  ;
Responder
  • Informação
  • Quem está online

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