Usuário com melhor resposta
Retornar um calculo de duas linhas em um resultado unico.

Pergunta
-
Bom dia, meu problema é o seguinte. Eu tenho uma tabela RECPAG com a seguinte estrutura:
CODBANCO RECPAG NOMEBANCO VALOR VALMOV
1 P CAIXA -100 15.000
1 R CAIXA -100 30.100
A coluna VALOR é o valor inicial e esta agrupado;
A coluna VALMOV é uma SUM de todas as movimentações;
O que preciso é pegar o valor inicial, que estar igual para P ou R, e se for P fazer VALOR - VALMOCV (o valor as vezes está negativo) e depois pegar esse resultado e somar com o VALMOV de R. Retornando tudo em uma única linha assim:
CODBANCO NOMEBANCO VALOR VALMOVATUAL
1 CAIXA -100 15.000
Obrigado desde já.
Respostas
-
Deleted
- Marcado como Resposta IgorFKModerator terça-feira, 29 de outubro de 2019 18:35
terça-feira, 29 de outubro de 2019 18:18
Todas as Respostas
-
Bom dia, meu problema é o seguinte. Eu tenho uma tabela RECPAG com a seguinte estrutura:
CODBANCO RECPAG NOMEBANCO VALOR VALMOV
1 P CAIXA -100 15.000
1 R CAIXA -100 30.100
A coluna VALOR é o valor inicial e esta agrupado;
A coluna VALMOV é uma SUM de todas as movimentações;
O que preciso é pegar o valor inicial, que estar igual para P ou R, e se for P fazer VALOR - VALMOCV (o valor as vezes está negativo) e depois pegar esse resultado e somar com o VALMOV de R. Retornando tudo em uma única linha assim:
CODBANCO NOMEBANCO VALOR VALMOVATUAL
1 CAIXA -100 15.000
Obrigado desde já.
Mateus,
Por acaso estamos fazendo referência ao conceito de Livro Caixa? É isso mesmo, temos um saldo inicial e conforme a movimentação esta sendo vai sendo atualizado para mais ou para menos.
Estou certo?
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
José obrigado pela ajuda, sou iniciante em SQL e já me ajudou muito, porém não deu certo.
No caso esse VALMOV é uma SUM de uma outra tabela onde tem os valores de movimentação, então quando tento usar aparece esse erro.
Não é possível executar uma função de agregação em uma expressão que contenha uma agregação ou uma subconsulta.
Minha query está assim.
SELECT
B.CODBANCO,
V.RECPAG,
N.NOMEBANCO,
B.VALOR,
V.SUM(V.VALOR),
B.VALOR + sum (case when V.RECPAG = 'P' then -sum(V.valor) else -sum(V.valor) end) as VALMOVATUAL
FROM B, V, N
GROUP BY B.CODBANCO, V.VALOR, V.RECPAG, N.NOMEBANCO
ORDER BY B.CODBANCO -
Mateus,
Respeitando o seu Select, veja se este exemplo baseado em Derived Table poderá lhe ajudar:
Select CodBanco, RecPag, NomeBanco, Valor, VALOR + sum (case when RECPAG = 'P' then -VALMOV else VALMOV end) as VALMOVATUAL From (SELECT B.CODBANCO, V.RECPAG, N.NOMEBANCO, B.VALOR, SUM(V.VALOR) as VALMOV FROM B, V, N -- Cuidado você vai ter um resultado gerado através de um produto cartesiano -- GROUP BY B.CODBANCO, V.VALOR, V.RECPAG, N.NOMEBANCO) As A
Group By CodBanco, RecPag, NomeBanco, Valor Go
Este é somente um exemplo, um esboço, pode conter erros. Como já destacado estou levando em consideração o seu Select inicial, verifique também a declaração das tabelas B, V, N você vai forçar uma junção cruzada entre as linhas de cada tabela, sendo estas multiplicadas entre si provocando um produto cartesiano ao final.
Avalie as possibilidades de você estabelecer as devidas e corretas junções entre estas tabelas.
Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
- Editado Junior Galvão - MVPMVP terça-feira, 29 de outubro de 2019 18:21
-
Ótimo, deu certo. só mais uma coisa, eu conseguiria juntar agora os resultados em uma unica linha.
Está assim:
CODBANCO RECPAG BANCO VALMOVATUAL
004 P CAIXA -89,20
004 R CAIXA 98,66Se possível preciso assim, fazer o resultado do P + R e aparecer assim
CODBANCO BANCO VALMOVATUAL
004 CAIXA 9,46
- Editado mateusfenoglio terça-feira, 29 de outubro de 2019 18:10
-