Consulta SQL - Dados Duplicados 1 - N

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
rohilario_
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 30 Out 2019 8:37 am

Galera, boa tarde!! :D :D

Estou tentando realizar uma consulta, onde eu tenho as colunas de NUMBONUS, NUMNOTA, DATA1 E DATA2, onde eu somo as duas datas e preciso que me retorne o NUMBONUS.

A problemática: Um NUMBONUS tem Várias Notas, e no meu SQL atual ele está me retornando o somatório das datas para cada NUMNOTA, quando ele deveria mostrar só um resultado para cada NUMBONUS.

Meu SQL atual:

Selecionar tudo

select NUMNOTA, NUMBONUS, TO_date((N.DTENT || ' '|| N.HORALANC ||':'|| N.MINUTOLANC), 'DD-MM-YYYY hh24:mi:ss'), N.DTWMS 
from pcnfent n 
where n.numbonus = 58536
Quem puder me ajudar, agradeço de verdade!!!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5023
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

O que significa "somar duas datas"?

Quanto é 10-fev-2019 + 5-dezembro-2010 ?
:roll:
rohilario_
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 30 Out 2019 8:37 am

dr_gori escreveu:O que significa "somar duas datas"?
Desculpa, na verdade é uma subtração, e é subtraído DATA e HORA, algo como 31/10/2019 12:54:59 - 30/10/2019 16:34:47, me retornando um valor fracionado em dias, que multiplicado por 60 ou 1440 me retorna valores em horas ou minutos, respectivamente.
Quanto é 10-fev-2019 + 5-dezembro-2010 ?
Algo como isto: -0,006643518518518518518518518518518518518519 (fração em dias)
Peguei essa dica, inclusive aqui no FORUM haha :D :D :D
:roll:
De toda forma, a problemática não é neste ponto, pois isso eu já estou conseguindo fazer perfeitamente.
O grande lance que está me travando, é o fato das duplicações. Ele deveria retornar somente um único número de bonus(NUMBONUS). o Where nesse SQL é só de exemplo mesmo, pois esta SQL sera uma SQL dinâmica futuramente.

CODIGO ATUALIZADO:

Selecionar tudo

select NUMNOTA, NUMBONUS, TO_date((N.DTENT || ' '|| N.HORALANC ||':'|| N.MINUTOLANC), 'DD-MM-YY hh24:mi:ss'), N.DTWMS, TO_date((N.DTENT || ' '|| N.HORALANC ||':'|| N.MINUTOLANC), 'DD-MM-YY hh24:mi:ss') - N.DTWMS AS resultado from pcnfent n where n.numbonus = 58130
Segue também print da consulta e o resultado.

dr_gori Obrigado pela atenção :wink:
Anexos
Consulta e Resulta SQL
Consulta e Resulta SQL
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5023
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

Pelo que eu to vendo, basta somar todas as linhas agrupadas por NUMBONUS.
Pra isso, você tira o campo NUMNOTA fora.
Algo assim:

Selecionar tudo

select n.NUMBONUS
, sum (TO_date((N.DTENT || ' '|| N.HORALANC ||':'|| N.MINUTOLANC), 'DD-MM-YY hh24:mi:ss') - N.DTWMS) AS resultado 
from pcnfent n 
where n.numbonus = 58130
group by n.numbonus
É isso ?
rohilario_
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 30 Out 2019 8:37 am

dr_gori, antes de mais nada, obrigado mais uma vez pela resposta.
Chegou perto, eu já havia tentado isso, mas ainda não está certo, pois usando o Group By ele soma os valores de cada linha..
Que neste caso são duas linhas pois tenho duas notas(NUMNOTA), onde o resultado das somas é uma de -0,00664335... e outra de -0,000393518... totalizando -0,00703703703703704 (aproximadamente) que foi o resultado da sua Query :( :(

Preciso que ele não some os resultados, independente da quantidade de notas, pois o que me interessa é o valor de uma única nota, podendo ser a da maior nota por exemplo.

Em anexo o resultado da sua Query

Obrigado pela resposta!!
Anexos
resultado query dr_gori
resultado query dr_gori
resultado_query.png (10.82 KiB) Exibido 6395 vezes
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5023
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

Pode fazer assim então:

Selecionar tudo

select n.NUMBONUS, n.NUMNOTA
, TO_date((N.DTENT || ' '|| N.HORALANC ||':'|| N.MINUTOLANC), 'DD-MM-YY hh24:mi:ss') - N.DTWMS AS resultado
from pcnfent n
where n.numbonus = 58130
  and n.numnota = (select max(y.numnota) from pcnfent y where y.numbonus = n.numbonus)
group by n.numbonus
Assim ele pega só a nota de maior número.
rohilario_
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 30 Out 2019 8:37 am

dr_gori escreveu:Pode fazer assim então:

Selecionar tudo

select n.NUMBONUS, n.NUMNOTA
, TO_date((N.DTENT || ' '|| N.HORALANC ||':'|| N.MINUTOLANC), 'DD-MM-YY hh24:mi:ss') - N.DTWMS AS resultado
from pcnfent n
where n.numbonus = 58130
  and n.numnota = (select max(y.numnota) from pcnfent y where y.numbonus = n.numbonus)
group by n.numbonus
Assim ele pega só a nota de maior número.
Obrigadíssimo!! Eu só troquei o seu max pelo min, pois o max estava retornando o menor valor e o min estava retornando o maior valor!
Também retirei o groupby, pois com ele estava dando erro.

dr_gori, muito obrigado mesmo pela ajuda!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante