Salut tout le monde et merci pour votre aide.
J'ai la situation suivante: une table appelée instructions qui contient les champs id (int), stmnt_date (date), débit (double), crédit (double) et solde (double)
Je veux calculer le solde en suivant ces règles:
Le solde de la première ligne ( chronologiquement ) = débit - crédit et pour le reste des lignes
solde de ligne actuel = solde de ligne précédent chronologiquement + débit de ligne actuel - crédit de ligne actuel
Comme vous pouvez le voir sur l'image ci-dessus, les lignes ne sont pas organisées par date et c'est pourquoi j'ai utilisé le mot chronologiquement deux fois pour souligner l'importance de la valeur stmnt_date.
Merci beaucoup pour votre aide.
CREATE TABLE
instructions et les exemples de données (avecINSERT
).Réponses:
En supposant que cela
stmnt_date
a uneUNIQUE
contrainte, ce serait assez facile avec les fonctions fenêtre / analytique:Malheureusement, MySQL n'a pas (encore) implémenté de fonctions analytiques. Vous pouvez résoudre le problème soit avec du SQL strict, en joignant automatiquement la table (qui devrait être plutôt inefficace bien que fonctionnant à 100%) ou en utilisant une fonctionnalité MySQL spécifique, des variables (qui seraient assez efficaces mais vous devrez les tester lors de la mise à niveau de mysql, pour être sûr que les résultats sont toujours corrects et non altérés par certaines améliorations d'optimisation):
Avec vos données, il en résultera:
la source
Je pense que vous pouvez essayer ce qui suit:
la source
réponse de ypercube est assez spectaculaire (je n'avais jamais vu de création de variable dans une seule requête via une sélection factice comme celle-ci), voici donc l'instruction CREATE TABLE pour votre commodité.
Pour les images de données tabulaires dans Google Image Search, vous pouvez utiliser https://convertio.co/ocr/ ou https://ocr.space/ pour le convertir en document texte. Ensuite, si l'OCR n'a pas détecté correctement les colonnes et que vous avez un Mac, utilisez TextWrangler avec la touche d'option enfoncée pour effectuer une sélection rectangulaire et déplacer les colonnes. La combinaison d'un éditeur SQL comme Sequel Pro , TextWrangler et d'une feuille de calcul comme Google Docs rend le traitement des données tabulaires séparées par des tabulations extrêmement efficace.
Si je pouvais mettre tout cela dans un commentaire, je le ferais, alors ne votez pas cette réponse.
la source
Tables à jonction automatique ce n'est pas très rapide sur les grandes tables. Donc, face à cette tâche sur PostgreSQL, j'ai décidé d'utiliser la fonction de déclenchement pour calculer "l'équilibre" des champs stockés. Tous les calculs ne se produisent qu'une seule fois pour chaque ligne.
la source
Dans, par exemple, MSSQL:
Utilisez une instruction with () pour générer un CTE. Il s'agit essentiellement d'un jeu de résultats temporaire qui affichera la valeur de chaque ligne. Vous pouvez utiliser les mathématiques dans l'instruction with pour créer une colonne à la fin, en utilisant les mathématiques pour montrer que le total de la ligne est DEBIT-CREDIT. Dans votre instruction with, vous devrez attribuer des numéros de ligne à chaque ligne, utilisez la clause OVER de WITH () pour classer par stmnt_date.
Ensuite, joignez récursivement la table sur elle-même, en utilisant a.ROWNUMBER = b.ROWNUMBER-1 ou +1 qui vous permettra de référencer a.total + b.total = total de cette ligne et de la ligne précédente.
J'apprécie de ne pas fournir le code mais c'est la méthode pratique pour y parvenir. Je peux fournir du code sur demande :)
la source