Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/03/2011, 20h59   #1
Invité de passage
 
Femme
Étudiant
Inscription : mars 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2011
Messages : 3
Points : 0
Points : 0
Par défaut Requête SQL

Bonjour,

Je suis un peu limitée en SQL et j'ai un soucis avec une requête.

Je dispose de la table "employes" définie comme :
Code :
1
2
3
4
5
6
7
8
9
10
CREATE TABLE IF NOT EXISTS `employes` (
  `num_employe` int(11) NOT NULL,
  `nom` varchar(50) NOT NULL,
  `departement` char(1) NOT NULL,
  `salaire` varchar(50) NOT NULL,
  `succursale` int(11) NOT NULL,
  PRIMARY KEY (`num_employe`),
  KEY `succursale` (`succursale`),
  KEY `departement` (`departement`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Je dois lister le nombre d'employés par succursale, ainsi que le montant des salaires par succursales dans les 4 départements existant :
Code :
1
2
3
4
5
Succursale	Employés par succursale	Dep1	Dep2	Dep3	Dep4
1		10		        xxx	xxx	xxx	xxx
2		10		        xxx	xxx	xxx	xxx
3		10		        xxx	xxx	xxx	xxx
4		13		        xxx	xxx	xxx	xxx
J'ai essayé la requête suivante :
Code :
1
2
3
4
5
6
7
8
9
SELECT 
succursale AS "Succursale", 
COUNT(*) AS "Employés par succursale", 
(SELECT SUM(salaire) FROM employes WHERE departement = 'Dep1' GROUP BY succursale) AS "Dep1",
(SELECT SUM(salaire) FROM employes WHERE departement = 'Dep2' GROUP BY succursale) AS "Dep2",
(SELECT SUM(salaire) FROM employes WHERE departement = 'Dep3' GROUP BY succursale) AS "Dep3",
(SELECT SUM(salaire) FROM employes WHERE departement = 'Dep4' GROUP BY succursale) AS "Dep4"
FROM employes 
GROUP BY succursale
Mais elle retourne #1242 - Subquery returns more than 1 row

Du coup, je suis un peu bloquée... quelqu'un pourrait il m'aider ?

Merci
Nadege87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 12h16   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Bonjour,

La présentation que vous souhaitez faire en sortie de requête est un problème de cosmétique, et le SQL n'est pas fait pour ça. Même si c'est faisable sous forme de requête, cette dernière ne serait plus valable et devrait être modifiée le jour où un nouveau département serait créé (par exemple).

Donc, il vaut mieux exécuter une requête plus simple, et déléguer l'affichage au langage de programmation que vous utilisez pour cet affichage (PHP, Java...).
La requête devient alors :
Code :
1
2
3
4
5
6
SELECT 
succursale, departement, 
COUNT(*) AS "Employés par succursale", 
SUM(salaire) AS salaire
FROM employes 
GROUP BY succursale, departement
Cette requête donne le nombre d'employés et le total des salaires pour chaque succursale et chaque département. Il faut alors sommer les départements d'une même succursale pour obtenir le total par succursale (ou alors refaire une autre requête uniquement par succursale. En effet, MySQL ne dispose pas des fonctions de fenêtrage, qui permettent, pour chaque département, de connaître le nombre d'agent au sein de la succursale à laquelle appartient le département.
Il faut donc passer par 2 requêtes.

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 06h52   #3
Invité de passage
 
Femme
Étudiant
Inscription : mars 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2011
Messages : 3
Points : 0
Points : 0
Bonjour ced et merci pour votre réponse.

Citation:
Envoyé par ced Voir le message
Même si c'est faisable sous forme de requête, cette dernière ne serait plus valable et devrait être modifiée le jour où un nouveau département serait créé (par exemple).
Je suis justement intéressée par ce cas bien concret (même si comme vous l'avez dit, la validité de la requête est éphémère) Auriez vous une requête à proposer qui répondrait à mon besoin ?

Merci
Nadege87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 10h06   #4
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Au passage, dans la structure de votre table, le salaire est de type VARCHAR(50)... On ne peut donc pas faire de somme dessus.
En supposant qu'il s'agit d'une erreur dans le premier post, voici une requête qui produit l'affichage attendu :
Code :
1
2
3
4
5
6
7
8
9
SELECT succursale
, COUNT(*) AS nb_employe
, SUM(CASE WHEN departement = 'Dep1' THEN salaire ELSE 0 END) AS Dep1
, SUM(CASE WHEN departement = 'Dep2' THEN salaire ELSE 0 END) AS Dep2
, SUM(CASE WHEN departement = 'Dep3' THEN salaire ELSE 0 END) AS Dep3
, SUM(CASE WHEN departement = 'Dep4' THEN salaire ELSE 0 END) AS Dep4
FROM employes
GROUP BY succursale
ORDER BY succursale;
C'est une façon de faire, mais il y en a d'autres...

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 08h12   #5
Invité de passage
 
Femme
Étudiant
Inscription : mars 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : mars 2011
Messages : 3
Points : 0
Points : 0
Merci beaucoup ced pour votre aide
Nadege87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h42.


 
 
 
 
Partenaires

Hébergement Web