Como faço para Comparar campos de tabelas diferentes usando HAVING

21/07/2021

0

Estou tentando fazer uma consulta SQL no Firebird onde só irá retornar dados caso a soma dos campos da primeira tabela for diferente do Campo "vlrnota" da segunda tabela. Porém ao tentar rodar o SELECT, acusa erro:

Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)

SELECT sum((vlrunit*qtdade)+VLRICMSUBSTITUICAO+d.vlripi+d.vlriss-valdesconto+valacrescimo)soma,
d.numero,
vlrnota
FROM MOVIMENTACAO m

left join documentos d
on m.iddoc = d.iddoc

Group by vlrnota
HAVING VLRNOTA = (SELECT sum((vlrunit*qtdade)+VLRICMSUBSTITUICAO+d.vlripi+d.vlriss-valdesconto+valacrescimo) AS SOMA FROM MOVIMENTACAO)
Lucas Langaro

Lucas Langaro

Responder

Post mais votado

21/07/2021

tente algo assim:
SELECT
	d.numero,
	d.vlrnota,
	sum(m.vlrunit*m.qtdade)+d.VLRICMSUBSTITUICAO+d.vlripi+d.vlriss-d.valdesconto+d.valacrescimo soma
FROM
	documentos d
left join
	MOVIMENTACAO m
	on m.iddoc = d.iddoc
Group by
	d.numero, d.vlrnota,
	d.VLRICMSUBSTITUICAO,
	d.vlripi, d.vlriss,
	d.valdesconto, d.valacrescimo
Having
	d.vlrnota <> sum(m.vlrunit*m.qtdade)+d.VLRICMSUBSTITUICAO+d.vlripi+d.vlriss-d.valdesconto+d.valacrescimo

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

21/07/2021

Lucas Langaro

tente algo assim:
SELECT
	d.numero,
	d.vlrnota,
	sum(m.vlrunit*m.qtdade)+d.VLRICMSUBSTITUICAO+d.vlripi+d.vlriss-d.valdesconto+d.valacrescimo soma
FROM
	documentos d
left join
	MOVIMENTACAO m
	on m.iddoc = d.iddoc
Group by
	d.numero, d.vlrnota,
	d.VLRICMSUBSTITUICAO,
	d.vlripi, d.vlriss,
	d.valdesconto, d.valacrescimo
Having
	d.vlrnota <> sum(m.vlrunit*m.qtdade)+d.VLRICMSUBSTITUICAO+d.vlripi+d.vlriss-d.valdesconto+d.valacrescimo


Rodei o script e nao apresentou nenhuma mensagem de erro.
Porém mesmo colocando "<>" ali no having, o select está trazendo tanto valores iguais como valores diferentes, conforme exemplo abaixo:

|Numero |VLRNOTA |SOMA |
| 1 | 188 | 181 |
| 5 | 74,3 | 74,3 |
| 9 | 321,60 | 321,60 |
Responder

21/07/2021

Emerson Nascimento

não seria em função de algum arredondamento?
tente arredondar.
SELECT
    d.numero,
    d.vlrnota,
    sum(m.vlrunit*m.qtdade)+d.VLRICMSUBSTITUICAO+d.vlripi+d.vlriss-d.valdesconto+d.valacrescimo soma
FROM
    documentos d
left join
    MOVIMENTACAO m
    on m.iddoc = d.iddoc
Group by
    d.numero, d.vlrnota,
    d.VLRICMSUBSTITUICAO,
    d.vlripi, d.vlriss,
    d.valdesconto, d.valacrescimo
Having
    round(d.vlrnota,2) <> round(sum(m.vlrunit*m.qtdade)+d.VLRICMSUBSTITUICAO+d.vlripi+d.vlriss-d.valdesconto+d.valacrescimo,2)

Responder

21/07/2021

Lucas Langaro

não seria em função de algum arredondamento?
tente arredondar.
SELECT
    d.numero,
    d.vlrnota,
    sum(m.vlrunit*m.qtdade)+d.VLRICMSUBSTITUICAO+d.vlripi+d.vlriss-d.valdesconto+d.valacrescimo soma
FROM
    documentos d
left join
    MOVIMENTACAO m
    on m.iddoc = d.iddoc
Group by
    d.numero, d.vlrnota,
    d.VLRICMSUBSTITUICAO,
    d.vlripi, d.vlriss,
    d.valdesconto, d.valacrescimo
Having
    round(d.vlrnota,2) <> round(sum(m.vlrunit*m.qtdade)+d.VLRICMSUBSTITUICAO+d.vlripi+d.vlriss-d.valdesconto+d.valacrescimo,2)




Fiz conforme está descrito, mas mesmo arredondando os valores continua retornando valores iguais.
Tentei fazer usando CASE, mas também não consegui fazer funcionar
Responder

21/07/2021

Emerson Nascimento

SELECT
    d.numero,
    d.vlrnota,
    sum(m.vlrunit*m.qtdade)+d.VLRICMSUBSTITUICAO+d.vlripi+d.vlriss-d.valdesconto+d.valacrescimo soma
FROM
    documentos d
left join
    MOVIMENTACAO m
    on m.iddoc = d.iddoc
Group by
    d.numero, d.vlrnota,
    d.VLRICMSUBSTITUICAO,
    d.vlripi, d.vlriss,
    d.valdesconto, d.valacrescimo
Having
    cast(d.vlrnota as numeric(12,2)) <> cast((sum(m.vlrunit*m.qtdade)+d.VLRICMSUBSTITUICAO+d.vlripi+d.vlriss-d.valdesconto+d.valacrescimo) as numeric(12,2))

Responder

21/07/2021

Lucas Langaro

SELECT
    d.numero,
    d.vlrnota,
    sum(m.vlrunit*m.qtdade)+d.VLRICMSUBSTITUICAO+d.vlripi+d.vlriss-d.valdesconto+d.valacrescimo soma
FROM
    documentos d
left join
    MOVIMENTACAO m
    on m.iddoc = d.iddoc
Group by
    d.numero, d.vlrnota,
    d.VLRICMSUBSTITUICAO,
    d.vlripi, d.vlriss,
    d.valdesconto, d.valacrescimo
Having
    cast(d.vlrnota as numeric(12,2)) <> cast((sum(m.vlrunit*m.qtdade)+d.VLRICMSUBSTITUICAO+d.vlripi+d.vlriss-d.valdesconto+d.valacrescimo) as numeric(12,2))



Eu estava colocando o "Cast" no "Select" e não no "Having".
Fazendo desse jeito que você mencionou, funcionou corretamente.
Muito obrigado pela ajuda.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar