Como faço para Comparar campos de tabelas diferentes usando HAVING
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)
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
Curtidas 0
Melhor post
Emerson Nascimento
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
GOSTEI 1
Mais Respostas
Lucas Langaro
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
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 |
GOSTEI 0
Emerson Nascimento
21/07/2021
não seria em função de algum arredondamento?
tente arredondar.
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)
GOSTEI 0
Lucas Langaro
21/07/2021
não seria em função de algum arredondamento?
tente arredondar.
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
GOSTEI 0
Emerson Nascimento
21/07/2021
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))
GOSTEI 0
Lucas Langaro
21/07/2021
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.
GOSTEI 0