Calcul de solde progressif en php mysql
ndalaba
Messages postés
3
Statut
Membre
-
Reivax962 Messages postés 3742 Statut Membre -
Reivax962 Messages postés 3742 Statut Membre -
Bonjour,
Je cherche a developper une application de gestion d'une caisse , mais je bloque sur le processus de calcul du solde progressif je demande de l'aide si kelkin a un script sa permettra de comprendre , merci d'avance
Je cherche a developper une application de gestion d'une caisse , mais je bloque sur le processus de calcul du solde progressif je demande de l'aide si kelkin a un script sa permettra de comprendre , merci d'avance
A voir également:
- Calcul de solde progressif en php mysql
- Solde carte fidélité auchan - Accueil - Guide arnaque
- Votre solde est insuffisant pour effectuer cette operation. veuillez recharger votre compte. - Forum Illustrator
- Contour progressif illustrator ✓ - Forum Illustrator
- Contour sur illustrator façon photoshop option fusion ✓ - Forum Illustrator
- Contour dégradé - Forum Graphisme
1 réponse
Bonjour,
Je vois deux genres de solutions :
1 - une sous requête ;
2 - une variable.
La première nécessite l'existence d'une colonne qui permette d'ordonner les données, mais tu as très certainement une date et une heure qui fera l'affaire.
Voici ce que ça pourrait donner :
1 -
Ça a l'avantage de tenir en une seule instruction, mais l'inconvénient de recalculer la somme à chaque itération.
2 -
C'est a priori plus optimisé en termes de performances et n'utilise pas de sous-requête. Par contre, ça tient sur deux instructions, et surtout je ne suis pas complètement sûr du comportement de la somme s'il y a un ORDER BY qui s'y rajoute (la somme se fait-elle sur les ligne telles qu'elles remontent du table scan, qui vont être triées a posteriori, faussant les résultats, ou se fait-elle après le ORDER BY ?)
Je n'ai pas de MySQL sous la main pour trancher, mais en tous cas ça te donne déjà deux pistes de travail.
Xavier
Je vois deux genres de solutions :
1 - une sous requête ;
2 - une variable.
La première nécessite l'existence d'une colonne qui permette d'ordonner les données, mais tu as très certainement une date et une heure qui fera l'affaire.
Voici ce que ça pourrait donner :
1 -
SELECT
c1.dateHeure,
c1.montant,
(SELECT SUM( montant )
FROM caisse c2
WHERE c2.dateHeure <= c1.dateHeure) AS cumulMontant
FROM caisse c1
ORDER BY c1.dateHeure
Ça a l'avantage de tenir en une seule instruction, mais l'inconvénient de recalculer la somme à chaque itération.
2 -
SET @cumul:=0;
SELECT
c1.dateHeure,
c1.montant,
(@cumul:=@cumul+ (c1.montant)) AS cumulMontant
FROM caisse c1
C'est a priori plus optimisé en termes de performances et n'utilise pas de sous-requête. Par contre, ça tient sur deux instructions, et surtout je ne suis pas complètement sûr du comportement de la somme s'il y a un ORDER BY qui s'y rajoute (la somme se fait-elle sur les ligne telles qu'elles remontent du table scan, qui vont être triées a posteriori, faussant les résultats, ou se fait-elle après le ORDER BY ?)
Je n'ai pas de MySQL sous la main pour trancher, mais en tous cas ça te donne déjà deux pistes de travail.
Xavier
Ce qui me semble être plutôt une bonne nouvelle pour le fonctionnement de ma deuxième solution, qui devient donc celle à privilégier.
Xavier
Je débute en mysql avec Version du serveur: 5.1.41-3ubuntu12.10 (phpmyadmin Version: 3.3.2deb1) et je vois que vos deux formules donnent satisfaction ... jusqu'au moment où les lignes 1 et 2 de la table contiennent le même nombre. Avec la formule 1 (pas de variable) dans ce cas, le cumul commence en ligne 1 avec pour résultat 2 fois le nombre! (je n'ai pas essayé avec la formule 2).
Savez-vous ce qui se passe?
Merci beaucoup.
Oui c'est logique...
Il te faudrait un autre critère de tri, qui soit strict.
Par contre, la deuxième méthode donnée plus haut ne devrait pas rencontrer ce problème.
Xavier