Olá a todos e obrigado por sua ajuda.
Eu tenho a seguinte situação: uma tabela chamada instruções que contém os campos id (int), stmnt_date (data), débito (duplo), crédito (duplo) e saldo (duplo)
Quero calcular o saldo seguindo estas regras:
O saldo da primeira linha ( cronologicamente ) = débito - crédito e para o restante das linhas
saldo da linha atual = saldo da linha cronologicamente anterior + débito da linha atual - crédito da linha atual
Como você pode ver na figura acima, as linhas não são organizadas por data e é por isso que usei a palavra cronologicamente duas vezes para enfatizar a importância do valor stmnt_date.
Muito obrigado pela sua ajuda.
CREATE TABLE
instruções e os dados de amostra (comINSERT
).Respostas:
Supondo que haja
stmnt_date
umaUNIQUE
restrição, isso seria bastante fácil com as funções analíticas / de janela:Infelizmente, o MySQL ainda não implementou funções analíticas. Você pode resolver o problema com SQL estrito, ingressando automaticamente na tabela (que deve ser bastante ineficiente, embora funcione 100%) ou usando um recurso específico do MySQL, variáveis (que seriam bastante eficientes, mas você teria que testá-lo ao atualizar o mysql, para ter certeza de que os resultados ainda estão corretos e não prejudicados por alguma melhoria na otimização):
Com seus dados, isso resultará em:
fonte
Eu acho que você poderia tentar o seguinte:
fonte
A resposta do ypercube é bastante espetacular (eu nunca tinha visto uma criação de variável em uma única consulta por meio de um dummy select assim), então aqui está a instrução CREATE TABLE para sua conveniência.
Para imagens de dados tabulares na Pesquisa de imagens do Google, você pode usar https://convertio.co/ocr/ ou https://ocr.space/ para convertê-las em um documento de texto. Então, se o OCR não detectou as colunas corretamente e você possui um Mac, use o TextWrangler com a tecla de opção pressionada para executar uma seleção retangular e mover as colunas. A combinação de editor SQL como Sequel Pro , TextWrangler e uma planilha como o Google Docs torna extremamente eficiente o tratamento de dados tabulares separados por tabulações.
Se eu pudesse colocar tudo isso em um comentário, por favor, não vote mais nesta resposta.
fonte
Mesas auto-adesivas não são muito rápidas em mesas grandes. Então, lidando com esta tarefa no PostgreSQL, decidi usar a função trigger para calcular o campo armazenado "balance". Todos os cálculos acontecem apenas uma vez para cada linha.
fonte
Em, por exemplo, MSSQL:
Use uma instrução with () para gerar um CTE. Este é essencialmente um conjunto de resultados temporário que mostrará o valor de cada linha. Você pode usar math na instrução with para criar uma coluna no final, usando math para mostrar que o total da linha é DEBIT-CREDIT. Na sua declaração with, você precisará atribuir números de linha a cada linha, use a cláusula OVER de WITH () para ordenar por stmnt_date.
Em seguida, junte recursivamente a tabela em si mesma, usando a.ROWNUMBER = b.ROWNUMBER-1 ou +1, o que permitirá que você consulte o a.total + b.total = total desta linha e da linha anterior.
Aprecio que não estou fornecendo o código, mas este é o método prático para conseguir isso. Eu posso fornecer código, se solicitado :)
fonte