{MySQL} différentes conditions sur un champs

Résolu
Mouradif Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   -  
Mouradif Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour tout le monde,

Avant de venir poser ma question ici j'ai fait un rapide tour de Google et à mon avis la solution n'existe pas. Je ne désespère pas pour autant et compte sur l'efficacité de l'aide communautaire de CCM.

Je viens de coder une application en PHP/MySQL qui gère des comptes d'ouvriers d'une bijouterie (à base d'entrées/sorties).
J'ai une table "opération" qui se présente comme ça :

CREATE TABLE IF NOT EXISTS `operation` (
`code` int(11) PRIMARY KEY AUTO_INCREMENT,
`timestamp` date,
`es` varchar(1),
`designation` varchar(50),
`poids` double,
`ouvrier` int(11),
`or` tinyint(4) DEFAULT '0'
)

le champs `es` vaut "e" si c'est une entrée et "s" si c'est une sortie
le champs `or` vaut 1 si l'opération un transfert d'or

je voudrais afficher sur une même vue (dans une seule requête) la somme des poids où `es` = "e" puis la somme des poids où `es` = "s" puis la somme des poids où es = "e" et or = 1.

Si vous n'avez pas la réponse mais que vous êtes sûr que c'est possible, faites le savoir quand même

Merci d'avance

5 réponses

swed
 
Bonjour,
Biensûr que c'est faisable !! ou alors j'ai pas compris la question.

Voici un exemple (que je n'ai pas testé) :

( SELECT es, SUM(POIDS) GROUP BY es )
UNION
( SELECT es, SUM(POIDS) WHERE or = 1 GROUP BY es )

La première partie te renvoie le total des poids E et S (sans se soucier de la donnée 'or').
La seconde partie te renvoie le total des poids E et S qui ont or = 1. Tu pourras y ajouter un WHERE si tu ne veux que les E...

Pour info, dans ton ordre de création de table :`or` tinyint(4) DEFAULT '0'
Si tu es consciencieux, tu ne devrais pas mettre de guillemets autour du 0, car c'est un entier.
(même si je sais, ca ne change rien, et ca fonctionne)

En espèrant t'avoir aidé;
Bonne journée !
1
swed
 
Re ;
Je pense que tu pourrais y arriver de cette manière :
(j'ai pas testé le code)

SELECT O1.OUVRIER, SOMMES_IN.SOMME, SOMMES_OUT.SOMME, SOMMES_OR.SOMME
FROM OPERATION O1,
(SELECT O2.OUVRIER, SUM(poids) AS SOMME FROM OPERATION O2 WHERE O2.OR = 1 GROUP BY O2.OUVRIER) SOMMES_OR,
(SELECT O3.OUVRIER, SUM(poids) AS SOMME FROM OPERATION O3 WHERE O3.es = 'e' GROUP BY O3.OUVRIER) SOMMES_IN,
(SELECT O4.OUVRIER, SUM(poids) AS SOMME FROM OPERATION O4 WHERE O4.es = 's' GROUP BY O4.OUVRIER) SOMMES_OUT
WHERE
O1.OUVRIER=SOMMES_OR.OUVRIER AND
O1.OUVRIER=SOMMES_IN.OUVRIER AND
O1.OUVRIER=SOMMES_OUT.OUVRIER;
1
Mouradif Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   36
 
Up !
0
Mouradif Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   36
 
Wha !
Merci infiniment, ça marche. Pas exactement comme je l'avais imaginé mais d'avoir ces 3 données sur un même résultat de requête c'est déjà bien.

En fait dans mon modèle relationnel, une opération appartient à un ouvrier (d'où le champs `ouvrier` qui est une clé étrangère).
J'en demande peut-être un peu trop mais dans l'idéal j'aimerais obtenir avec un regroupement par `ouvrier` ceci :


______________________________________________
|Ouvrier | SUM entrées | SUM sorties | SUM or |
_________|_____________|_____________|________|
| 74     |    5610     |     5420    |  384   |
_________|_____________|_____________|________|
| 12     |    1780     |     1450    |  860   |
_________|_____________|_____________|________|
| 19     |    4320     |     3897    | 2786   |
_________|_____________|_____________|________|
| 24     |     940     |      935    |   23   |
_________|_____________|_____________|________|



En gros, dans 3 colones différentes, un SUM avec une condition 1, un SUM avec une condition B et un SUM avec une condition C.

Si quelqu'un a une idée ce serait vraiment cool
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mouradif Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   36
 
Ouais c'est exactement ce que je voulais !
Merci Swed !
J'ai tout de même ajouté AS inputs, AS outputs et AS gold dans le premier SELECT et GROUP BY ouvrier à la fin de la requête.
0