Plusieurs SUM avec plusieurs conditions
Résolu
Coutcout86
Messages postés
195
Date d'inscription
Statut
Membre
Dernière intervention
-
Coutcout86 Messages postés 195 Date d'inscription Statut Membre Dernière intervention -
Coutcout86 Messages postés 195 Date d'inscription Statut Membre Dernière intervention -
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
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
A voir également:
- Sql sum plusieurs colonnes
- Classer par ordre alphabétique excel plusieurs colonnes - Guide
- Comment faire des colonnes sur word - Guide
- Inverser deux colonnes excel - Guide
- Tableau croisé dynamique plusieurs colonnes - Guide
- Logiciel sql - Télécharger - Bases de données
3 réponses
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.
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
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
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
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 ?