Registros duplicados

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
SOUSAW01
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qua, 02 Abr 2014 6:00 pm

Olá experts...

Estou tendo um problema de registros duplicados quando o ultimo campo a direita esta populado.

Retorno do select:

DFFUJDATA DIA ENTRADA SAIDA OCOR AHN DFMTVCODIGO DFMTVDESCRICAO
12/12/2005 Seg-Nor 13:53 22:02
13/12/2005 Ter-Nor 13:55 22:16 00:16 16 300 ADICIONAL NOTURNO
13/12/2005 Ter-Nor 13:55 22:16 00:16 16 835 BANCO HORAS POSITIVO ( + )
14/12/2005 Qua-Nor 13:53 22:01
15/12/2005 Qui-Nor 13:54 22:00

Veja que esta repetindo a linha DFFUJDATA (13/12/2005) até o campo 'AHN' , pois o DFMTVCODIGO e DFMTVDESCRICAO são distintos.

O que eu preciso era deixar em "blanco" (pular linha) quando não houvesse registro para o campo.

Retorno do select que necessito:

DFFUJDATA DIA ENTRADA SAIDA OCOR AHN DFMTVCODIGO DFMTVDESCRICAO
12/12/2005 Seg-Nor 13:53 22:02
13/12/2005 Ter-Nor 13:55 22:16 00:16 16 300 ADICIONAL NOTURNO
835 BANCO HORAS POSITIVO ( + )
14/12/2005 Qua-Nor 13:53 22:01
15/12/2005 Qui-Nor 13:54 22:00

Ou seja, quando tiver mais de uma linha no campo DFMTVCODIGO e FMTVDESCRICAO, que o select deixe em branco os campos: DFFUJDATA, DIA, ENTRADA, SAIDA, OCOR e AHN, evitando a duplicação de registros iguais.


Abaixo o código:

Selecionar tudo

 Select
TO_CHAR (DFFUJDATA, 'DD/MM/YYYY') DFFUJDATA,
initcap(substr(to_char(DFFUJDATA,'day','nls_date_language=portuguese'),1,3)) || '-' || decode(DFTPDCODIGOHOR,07,'Dom',decode(DFTPDCODIGOHOR,01,'Nor',decode(DFTPDCODIGOHOR,02,'Nor',decode(DFTPDCODIGOHOR,03,'Fol',decode(DFTPDCODIGOHOR,04,'Com',decode(DFTPDCODIGOHOR,06,'Pon','Err')))))) || decode(DFTPDCODIGOCAL, 05, '-Fer', null) Dia,
decode(To_char(TO_CHAR(FLOOR(max(decode(DFPONTIPO, 0, DFPILHORA, null))/60)),'00') || ':' ||
 TO_CHAR(TO_CHAR(MOD(max(decode(DFPONTIPO, 0, DFPILHORA, null)), 60),'00'), 'FM00'),':',null,
 to_char(TO_CHAR(FLOOR(max(decode(DFPONTIPO, 0, DFPILHORA, null))/60)),'00') || ':' ||
 TO_CHAR(TO_CHAR(MOD(max(decode(DFPONTIPO, 0, DFPILHORA, null)), 60),'00'),'FM00')) as Marcacoes_Entrada,
decode(To_char(TO_CHAR(FLOOR(max(decode(DFPONTIPO, 1, DFPILHORA, null))/60)),'00') || ':' ||
 TO_CHAR(TO_CHAR(MOD(max(decode(DFPONTIPO, 1, DFPILHORA, null)), 60),'00'), 'FM00'),':',null,
 to_char(TO_CHAR(FLOOR(max(decode(DFPONTIPO, 1, DFPILHORA, null))/60)),'00') || ':' ||
 TO_CHAR(TO_CHAR(MOD(max(decode(DFPONTIPO, 1, DFPILHORA, null)), 60),'00'),'FM00')) as Marcaoes_Saida,
decode(DFMTVCODIGO,078,null,decode(DFMTVCODIGO,null,null,(TO_CHAR(TO_CHAR(FLOOR(max(DFOCOHORAGER) / 60)),'00') || ':' ||
 TO_CHAR(TO_CHAR(MOD(max(DFOCOHORAGER), 60),'00'), 'FM00'))))as Ocorrencias,
max(DFOCOHORAGER) ahn_wanderlei,
decode(DFMTVCODIGO,078,null,DFMTVCODIGO) DFMTVCODIGO ,
decode(DFMTVCODIGO,078,null,DFMTVDESCRICAO) DFMTVDESCRICAO

FROM (select distinct A.DFFUJDATA,
             B.dfpontipo,
             B.dfpilhora,
             A.DFTPDCODIGOHOR,
             A.DFTPDCODIGOCAL,
             C.DFOCOHORAGER,
             D.DFMTVCODIGO,
             D.DFMTVDESCRICAO

  from  PFUJFPTO A,
        PPONFPTO B,
        POCOFPTO C,
        PMTVFPTO D

  where A.dfepscodigo = B.dfepscodigo  (+)
  and   A.dffuncracha   = B.dffuncracha (+)
  and   A.dffujdata  = B.dfpildata (+)
  and   A.dfepscodigo = C.dfepscodigo (+)
  and   A.dffuncracha = C.dffuncracha (+)
  and   A.dffujdata = c.dfocodata (+)
  and   C.DFMTVCODIGO = D.DFMTVCODIGO(+)
  and   C.DFEPSCODIGO = D.DFEPSCODIGO(+)
  and A.dffuncracha = '000000000052061'
  and A.dffujdata  between TO_DATE('12/12/2005', 'DD/MM/YYYY') and TO_DATE('11/01/2006', 'DD/MM/YYYY'))
  Group by DFFUJDATA, DFTPDCODIGOHOR, DFTPDCODIGOCAL, DFOCOHORAGER, DFMTVCODIGO, DFMTVDESCRICAO
Espero que encontre ajuda....

Obrigado!!!!
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá SOUSAW01,

Bem vindo ao forum GLUFKE.

Se você precisa fazer isso no SQL*PLUS, haveria condições de você usar funções deste produto para formatar a saida da sua querie

Bastaria, antes da execução da querie, adicionar o comando BREAK ON nas colunas que desejam que não se repitam.

Você precisaria:

A) Abrir uma sessão SQL*PLUS;
B) Executar os comandos abaixo:

Selecionar tudo

BREAK ON DFFUJDATA;
BREAK ON DIA; 
BREAK ON ENTRADA;
BREAK ON SAIDA;
BREAK ON OCOR;
BREAK ON AHN;
C) Rodar a querie desejada;

Mas lembre-se. Isso só funciona se você estiver dentro de uma sessão do produto ORACLE SQL*PLUS. O comando BREAK ON só é reconhecido por este produto.

Maiores informações você encontra neste link : http://docs.oracle.com/cd/B19306_01/ser ... 57/ch6.htm

Abraços,

Sergio Coutinho
Responder
  • Informação