Plusieurs SUM avec plusieurs conditions
Résolu/Fermé
Coutcout86
Messages postés
195
Date d'inscription
lundi 23 novembre 2009
Statut
Membre
Dernière intervention
26 mai 2016
-
21 nov. 2013 à 12:01
Coutcout86 Messages postés 195 Date d'inscription lundi 23 novembre 2009 Statut Membre Dernière intervention 26 mai 2016 - 21 nov. 2013 à 15:37
Coutcout86 Messages postés 195 Date d'inscription lundi 23 novembre 2009 Statut Membre Dernière intervention 26 mai 2016 - 21 nov. 2013 à 15:37
A voir également:
- Sql sum plusieurs colonnes
- Classer par ordre alphabétique excel plusieurs colonnes - Guide
- Formule moyenne excel plusieurs colonnes - Guide
- Word colonnes indépendantes - Guide
- Inverser deux colonnes excel - Guide
- Figer des colonnes excel - Guide
3 réponses
Utilisateur anonyme
21 nov. 2013 à 13:33
21 nov. 2013 à 13:33
salut,
avec un présentation de tes tables, les relations ainsi que ta requête actuelle, il sera possible de t'aider ;)
naga
avec un présentation de tes tables, les relations ainsi que ta requête actuelle, il sera possible de t'aider ;)
naga
J'ai une un table SEANCE qui contient la durée de la seance avec sa date. Cette table est liée avec une table matiere qui contient toutes les matiéres (Français, Histoire etc..). Et cette table matière, est liée à une table TYPE_MATIERE qui contient les types de matieres (Enseignements Général, Pro etc...)
Ensuite la table SEANCE est liée à une table PERSONNEL (par l'intermédiaire d'une relation n:n avec une table nommé SEANCE_PERSONNEL).Cela permet d'avoir les personnes liées à une SEANCE.
Et ce que j'aimerais faire c'est : Compter le nombre d'heure pour type de matiere et pour chaque personne.
Donc voici un exemple de ma requête :
'VE et 'TPC' sont mes types de matières. Sauf que cette requête ne fonctionne pas.
Pourriez-vous m'aider à résoudre cette problèmatique?
Merci d'avance.
Romain COUTINEAU.
Ensuite la table SEANCE est liée à une table PERSONNEL (par l'intermédiaire d'une relation n:n avec une table nommé SEANCE_PERSONNEL).Cela permet d'avoir les personnes liées à une SEANCE.
Et ce que j'aimerais faire c'est : Compter le nombre d'heure pour type de matiere et pour chaque personne.
Donc voici un exemple de ma requête :
SELECT
PERSONNEL.CODE_PERSONNEL,PERSONNEL.NOM_PERSONNEL,
PERSONNEL.PRENOM_PERSONNEL,s.COEF_PROF,
tm.ABREGE_TYPE_MATIERE,tm.NOM_TYPE_MATIERE,
SUM(CASE when tm.ABREGE_TYPE_MATIERE = 'VE' then s.DUREE else 0 END) AS VE,
SUM(CASE when tm.ABREGE_TYPE_MATIERE = 'TPC' then s.DUREE else 0 END) AS TPC
FROM PERSONNEL
LEFT JOIN FORM_ENSEIGNE_SEANCE AS FES ON FES.CODE_PERSONNEL = PERSONNEL.CODE_PERSONNEL
LEFT JOIN SEANCE AS s ON s.CODE_SEANCE = FES.CODE_SEANCE
LEFT JOIN MATIERE AS m ON m.CODE_MATIERE = s.CODE_MATIERE
LEFT JOIN TYPE_MATIERE as tm ON tm.CODE_TYPE_MATIERE = m.CODE_TYPE_MATIERE
WHERE s.DATE_SEANCE BETWEEN {ts '2013-08-01 00:00:00'} AND {ts '2014-07-20 00:00:00'}
GROUP BY
PERSONNEL.CODE_PERSONNEL,PERSONNEL.NOM_PERSONNEL,
PERSONNEL.PRENOM_PERSONNEL,s.COEF_PROF,
tm.ABREGE_TYPE_MATIERE,tm.NOM_TYPE_MATIERE
'VE et 'TPC' sont mes types de matières. Sauf que cette requête ne fonctionne pas.
Pourriez-vous m'aider à résoudre cette problèmatique?
Merci d'avance.
Romain COUTINEAU.
Reivax962
Messages postés
3672
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
21 nov. 2013 à 13:57
21 nov. 2013 à 13:57
Bonjour,
Par « ne fonctionne pas », tu entends quoi exactement ? Tu as un message d'erreur ? Un résultat qui ne te convient pas ? Si oui, en quoi ne te convient-il pas ?
Sinon, vu ta requête, les CASE WHEN ne servent à rien puisqu'ils portent sur un champ du GROUP BY.
As-tu essayé de les remplacer tous les deux par SUM(s.DUREE) tout simplement ?
Quitte à mettre, dans la clause WHERE, un tm.ABREGE_TYPE_MATIERE IN ('VE', 'TPC') si les autres ne t'intéressent pas.
Xavier
Par « ne fonctionne pas », tu entends quoi exactement ? Tu as un message d'erreur ? Un résultat qui ne te convient pas ? Si oui, en quoi ne te convient-il pas ?
Sinon, vu ta requête, les CASE WHEN ne servent à rien puisqu'ils portent sur un champ du GROUP BY.
As-tu essayé de les remplacer tous les deux par SUM(s.DUREE) tout simplement ?
Quitte à mettre, dans la clause WHERE, un tm.ABREGE_TYPE_MATIERE IN ('VE', 'TPC') si les autres ne t'intéressent pas.
Xavier
Coutcout86
Messages postés
195
Date d'inscription
lundi 23 novembre 2009
Statut
Membre
Dernière intervention
26 mai 2016
21 nov. 2013 à 14:05
21 nov. 2013 à 14:05
Je n'ai pas le résultat attendu pardon. En fait peut être que j'aurais du commencer par là mais mon résultat attendu serait celui-ci :
Array(
[0] => Array(
[0] => NomPersonnel
[1] => PrénomPersonnel
[2] => Heure TPC
[3] => Heure VE
[4] => Heure X ....
)
[1] => Array(
[0] => NomPersonnel2
[1] => PrénomPersonnel2
[2] => Heure TPC
[3] => Heure VE
[4] => Heure X ....
)
)
Je sais pas si c'est plus compréhensible comme ça :) Et si oui comment faire ?
Le IN dans une clause WHERE sert à quoi déjà ?
Merci d'avance.
Romain COUTINEAU
Array(
[0] => Array(
[0] => NomPersonnel
[1] => PrénomPersonnel
[2] => Heure TPC
[3] => Heure VE
[4] => Heure X ....
)
[1] => Array(
[0] => NomPersonnel2
[1] => PrénomPersonnel2
[2] => Heure TPC
[3] => Heure VE
[4] => Heure X ....
)
)
Je sais pas si c'est plus compréhensible comme ça :) Et si oui comment faire ?
Le IN dans une clause WHERE sert à quoi déjà ?
Merci d'avance.
Romain COUTINEAU
Reivax962
Messages postés
3672
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
21 nov. 2013 à 14:16
21 nov. 2013 à 14:16
Pour IN :
champ IN ('a', 'b', 'c')
est une autre façon de dire
champ = 'a' OR champ = 'b' OR champ = 'c'.
Mais du coup, ça n'est pas la bonne méthode. Je n'avais pas compris que tu voulais les sommes par matière sur une même ligne.
Du coup, tu peux reprendre ta requête, mais en enlevant
tm.ABREGE_TYPE_MATIERE,tm.NOM_TYPE_MATIERE
du SELECT et du GROUP BY.
Xavier
champ IN ('a', 'b', 'c')
est une autre façon de dire
champ = 'a' OR champ = 'b' OR champ = 'c'.
Mais du coup, ça n'est pas la bonne méthode. Je n'avais pas compris que tu voulais les sommes par matière sur une même ligne.
Du coup, tu peux reprendre ta requête, mais en enlevant
tm.ABREGE_TYPE_MATIERE,tm.NOM_TYPE_MATIERE
du SELECT et du GROUP BY.
Xavier
Coutcout86
Messages postés
195
Date d'inscription
lundi 23 novembre 2009
Statut
Membre
Dernière intervention
26 mai 2016
21 nov. 2013 à 14:19
21 nov. 2013 à 14:19
En enlevant le GROUP BY cela me génère une erreur de type :
Erreur SQLColumn 'PERSONNEL.CODE_PERSONNEL' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
C'est pour cela que j'avais ajouté mon GROUP BY.
As-tu une petite idée concernant cette erreur ?
Erreur SQLColumn 'PERSONNEL.CODE_PERSONNEL' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
C'est pour cela que j'avais ajouté mon GROUP BY.
As-tu une petite idée concernant cette erreur ?
Coutcout86
Messages postés
195
Date d'inscription
lundi 23 novembre 2009
Statut
Membre
Dernière intervention
26 mai 2016
21 nov. 2013 à 15:37
21 nov. 2013 à 15:37
J'avais mal lu ta réponse et cela fonctionne correctement quand on relit quelque chose ;)
Merci beaucoup !
Merci beaucoup !