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

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

Aceitar