Sommes et cumul par lignes

Le problème exposé dans ce sujet a été résolu.

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  :)

+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

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.

+0 -0

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).

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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