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
Bonjour,

J'ai un petit soucis concernant une de mes requêtes SQL et j'aimerais avoir de l'aide sur celle-ci. Voilà j'aimerais que dans une seule requête j'ai plusieurs somme venant d'une même table mais ayant des filtres différents.

Pour exemple , j'ai plusieurs type de matière (Anglais, Français, Maths) et j'aimerais compter le nombre d'heure dans chacune des matières sur une seule requête est-ce possible ?

J'ai essayé les CASE WHEN THEN et ça ne fonctionne pas comme je le veux (ou je ne sais peut être pas les utiliser... :/ )

Pourriez-vous m'aider ?

Merci d'avance.
Romain COUTINEAU

3 réponses

Utilisateur anonyme
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
0
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 :


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.
0
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
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
0
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
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
0
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
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
0
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
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 ?
0
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
J'avais mal lu ta réponse et cela fonctionne correctement quand on relit quelque chose ;)

Merci beaucoup !
0