Sommes et cumul par lignes

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous !

J'ai toujours eu et ai encore de la peine avec des requêtes SQL qui me paraissent complexes. Là, j'ai justement un cas que j'aimerais vous soumettre.

J'ai des listes d'enregistrements représentant des commandes et qui se présentent comme suit :

Prix de vente ▼ Quantité Prix d'achat Marge ($quantité * (prixDeVente - prixDachat)$)
25 2 20 10
24 3 20 12
23 1 20 3

Maintenant, ce que j'aimerais, c'est d'une part un tableau ordonné dont chaque ligne tient compte de ce qu'il y a au-dessus d'elle pour la quantité :

Prix de vente ▼ Quantité Prix d'achat Marge
25 2 20 10
24 5 (2 + 3) 20 20
23 6 (5 + 1) 20 18

L'idée étant aussi de récupérer la ligne où la marge est maximale. En soi, ça devrait correspondre à un HAVING marge = MAX(marge) si je ne me trompe pas. Le souci es au niveau des sommes de quantités par lignes.
Est-ce que c'est possible avec MySQL ?

Le but final est d'envoyer une requête à Doctrine, donc DQL, SQL, c'est pas un réel souci, mais une table intermédiaire, je suis moins certain.

Merci d'avance  :)

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0

Salut,

excuse moi je n'ai pas totalement compris, mais je me tente quand même à te répondre.

Pourquoi ne pas faire une simple boucle ou tu garde dans une variable la ligne précédente et tu fais tes calculs jusqu'à terminer la boucle ?

+0 -0
Auteur du sujet

Parce que je dois pouvoir récupérer rapidement (si possible sans avoir à calculer tout le tableau) le prix de vente correspondant à la marge la plus importante

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0

Alors dans ta base tu peux ajouter une colonne "Marge_calcul", comme sa à chaque insertion tu prend le dernier avec donc la marge calculé à jour et tu na pas besoin de refaire le calcul de toute la base à chaque fois

+0 -0
Auteur du sujet

Alors dans ta base tu peux ajouter une colonne "Marge_calcul", comme sa à chaque insertion tu prend le dernier avec donc la marge calculé à jour et tu na pas besoin de refaire le calcul de toute la base à chaque fois

WinXaito

Il y a une chose que j'ai omis de préciser, c'est que le cumul se fait du plus grand au plus petit prix de vente, mais l'insertion des lignes ne suit pas nécessairement cette logique. Donc si j'insère une commande à un certain prix, alors je devrais recalculer la marge pour toutes les commandes qui ont des prix plus petits.

Tu peux le faire de façon programmatique avec MySQL : https://dev.mysql.com/doc/refman/5.0/en/loop.html mais après je sais pas si Doctrine aime ça.

kdev

Je pense aussi que Doctrine ORM n'aime pas trop le programmatique. Mais si besoin, je pense que je pourrais passer par le DBAL, qui devrait être plus souple.

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0

Cette réponse a aidé l'auteur du sujet

Il y a peut-être moyen d'utiliser des variables sans être obligé de passer par des procédures stockées.

JE pense à quelque chose dans ce genre-là :

1
2
3
4
5
6
7
set @cumul := 0;

select quantite, prixVente, prixAchat,
 @cumul := @cumul + quantite as quantiteCumulee, 
@cumul * (prixVente-prixAchat) as marge
from tatable
order by prixVente desc

Par contre pour récupérer la marge la plus grande, à mon avis tu es obligé de passer par une table temporaire ou une vue. JE n'arrive pas à récupérer quelque chose d'utile avec une clause du genre having x=max(x).

Édité par QuentinC

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+1 -0
Auteur du sujet

Il y a une chose qu'on oublie parfois, c'est que quelque chose comme HAVING/WHERE `truc` = max(`truc`) revient à faire un ORDER BY `truc` DESC LIMIT 1, et du coup, ça marche  :D

Merci

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte