{MySQL} différentes conditions sur un champs

Résolu/Fermé
Mouradif Messages postés 26 Date d'inscription lundi 18 février 2008 Statut Membre Dernière intervention 5 novembre 2019 - 4 mars 2010 à 13:06
Mouradif Messages postés 26 Date d'inscription lundi 18 février 2008 Statut Membre Dernière intervention 5 novembre 2019 - 8 mars 2010 à 11:15
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

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
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 26 Date d'inscription lundi 18 février 2008 Statut Membre Dernière intervention 5 novembre 2019 36
5 mars 2010 à 15:20
Up !
0
Mouradif Messages postés 26 Date d'inscription lundi 18 février 2008 Statut Membre Dernière intervention 5 novembre 2019 36
5 mars 2010 à 18:11
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 26 Date d'inscription lundi 18 février 2008 Statut Membre Dernière intervention 5 novembre 2019 36
8 mars 2010 à 11:15
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