SQL - faire une somme de valeurs sur plusieurs champs

Eléphant du PHP | 164 Messages

30 janv. 2009, 15:08

Alors voilà j'ai une question à élucider .... je vous met d'abord un petit tableau pour l'explication :

Image

Donc en fait je dois calculer la somme totale des A, la somme des B , la somme des C ...

seulement j'ai 30 champs (uti01, uti02, uti03) et 8 valeurs à additionner comme ça ...

en sachant que j'ai 15/20 produits maximum à calculer ... donc je sais pas si vous voyez la requête !!!

y a-t-il une solution qui pourrait me facilier la vie ?
MERCI D'AVANCE ;-)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

30 janv. 2009, 15:18

Et oui, sauf cas très particulier, on peut s'apercevoir d'une erreur de conception au moment des requêtes de calcul... quand on a des colonnes qui se répètent (30 !) c'est qu'il y a un problème.

Là, ça va effectivement être compliqué. À base de if et de else dans la requête peut-être.

Est-ce que tu n'as pas moyen de modifier le schéma de ta base ?

Code : Tout sélectionner

produits (id_produit, id_uti, valeur) // éventuellement une table uti (qu'est-ce que c'est ?) uti (id_uti, libellé)
=>

Code : Tout sélectionner

SELECT id_produit, id_uti, SUM(valeur) FROM table GROUP BY valeur
Un peu abstrait ton exemple, peut-être qu'en sachant ce que c'est que "uti" et à quoi correspondent en vrai les A, B, C ce seraitplus facile.

Eléphant du PHP | 164 Messages

30 janv. 2009, 15:36

Alors en fait c'est une gestion de pose de palissades professionnelles.

On a des modules de tailles différentes et différentes pièces à compter :
- A : module de 1200 mm
- B : module de 800 mm
- C : module de 540 mm
- D : barre d'angle
etc (il y a 8 choix possibles)

uti01, uti02 correspondent à des champs ...
uti01 = premier module
uti02 = deuxieme module
uti03 = troisieme module
...

produit01, produit02 sont les noms de chaque dossier de pose.


Une fois remplit celà permet d'une part de compter combien de modules A, B, C ... sont utilisés (pour débiter nos différents stocks répartis sur la France, et ainsi savoir ce qui reste)
D'autre part celà permet de générer un plan de montage pour le poseur (A correspond à une image, B à une autre ... et elles se mettent bout à bout pour former le plan technique).

Voilou pour le détail ;)

Tu crois que je ferai mieux de faire une table séparée ?
#palissade_id (numéro d'id de la palissade)
#stock_position (ici est enregistré la position du module (équivaut à uti01 ...)
#stock_module (ici est enregistré la lettre du module A, B, C ...)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

30 janv. 2009, 18:44

Oui effectivement un truc dans le genre de ce que tu as proposé serait plus facile à manipuler :

Code : Tout sélectionner

Produits --> les dossiers de palissades -------- id_produit libellé_produit Modules --> le catalogue ------- id_module code_module libellé_module Compose --> relation Produits/Modules : la composition de chaque palissade ------- fk_produit fk_module position
Ce qui donnerait par exemple, si je veux une palissade carrée de 800 mm de côté (si j'ai bien compris le truc et si j'ai un tout petit jardin) :

Code : Tout sélectionner

Produits ------------- id_produit | libellé produit 1 "palissade pour ouckileou" Modules -------------- id_module | code_module | libellé_module 1 A "module de 1200 mm" 2 B "module de 800 mm" 3 C "module de 400 mm" 4 D "barre d'angle" Compose -------------- fk_produit | fk_module | position 1 4 1 1 2 2 1 4 3 1 2 4 1 4 5 1 2 6 1 4 7 1 2 8
Ensuite, si tu veux connaître le nombre de chaque module utilisé (uniquement les modules utilisés au moins une fois) :

Code : Tout sélectionner

SELECT code_module, COUNT(*) FROM modules m INNER JOIN compose c ON m.id_module = c.fk_module GROUP BY code_module

Le même compte, mais pour chaque produit :

Code : Tout sélectionner

SELECT id_produit, libelle_produit, code_module, COUNT(*) FROM modules m INNER JOIN compose c ON m.id_module = c.fk_module INNER JOIN produits p ON m.fk_produit = p.id_produit GROUP BY id_produit, code_module

Eléphant du PHP | 164 Messages

02 févr. 2009, 10:12

Oula faut que j'étudie tes requêtes LOL mais merci ;)

Sinon c'est plutot des palissades pour mettre devant un magasin pendant des travaux ;)

++