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 01/12/2010, 22h42   #1
Invité de passage
 
Étudiant
Inscription : décembre 2010
Messages : 5
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2010
Messages : 5
Points : 0
Points : 0
Par défaut Tableau à deux dimensions à partir de 3 tables

Bonsoir,

ma base est, entre autres, constituée de 3 tables avec les champs suivants :
client : id_filière, id_promo
filiere : id, nom (valeur : Info, Elec, Telecom)
promo : id, nom (valeur : 1A, 2A, 3A)

Ce que j'aimerai faire, c'est un tableau qui donne le nombre de clients appartenant à une promo et à une filière. Par exemple :
Code :
1
2
3
4
5
6
7
8
~~| Info |Elec | Telecom
---+ ----+----+--------      
1A |  27  | 36  | 12
---+-----+----+--------
2A |  10  | 89  | 23
---+-----+----+--------
3A |  45  | 39  | 74
---+-----+----+--------
Je ne sais pas comment faire pour obtenir à la fois des éléments en colonne et en ligne.
Sachant que par la suite je dois pouvoir calculer la somme sur les lignes et les colonnes. Mais ça, je pensais le faire en PHP.

Merci par avance. Je vais continuer à chercher de mon côté.
Thompey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 00h02   #2
Membre Expert
 
Avatar de Nudger
 
Homme Thomas Arnaud
Directeur de projet
Inscription : octobre 2010
Messages : 452
Détails du profil
Informations personnelles :
Nom : Homme Thomas Arnaud
Âge : 36
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Directeur de projet
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : octobre 2010
Messages : 452
Points : 1 012
Points : 1 012
Envoyer un message via Skype™ à Nudger
Bonsoir,

Citation:
Envoyé par Thompey Voir le message
Je ne sais pas comment faire pour obtenir à la fois des éléments en colonne et en ligne.
Le SQL ne le permet pas, à moins de faire un truc tordu.
Au mieux il est possible d'avoir un résultat du style

Promo | Filière | Count

Ce résultat contiendra toutes les données souhaitées, mais présentées différemment.
Ensuite en PHP, ça ne devrait pas être très compliqué pour fabriquer le tableau.
__________________
www.nudge.org Surveillez et optimisez vos applications Java
Nudger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 05h13   #3
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 528
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 528
Points : 3 519
Points : 3 519
Saluton,
Tu peux t'inspirer de mon article afférent à l'émulation d'un tableau croisé [quasi]-dynamique dont le lien est dans ma signature.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 09h25   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 960
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 960
Points : 18 181
Points : 18 181
Envoyer un message via MSN à CinePhil
Pas si tordu que ça ! Essaie ceci :
Code :
1
2
3
4
5
6
7
8
9
SELECT p.nom, 
    SUM(CASE f.nom = 'Info' THEN 1 ELSE 0 END) AS Info,
    SUM(CASE f.nom = 'Elec' THEN 1 ELSE 0 END) AS Elec,
    SUM(CASE f.nom = 'Telecom' THEN 1 ELSE 0 END) AS Telecom
FROM client AS c
INNER JOIN filiere AS f ON f.id = c.id_filiere
INNER JOIN promo AS p ON p.id = c.id_promo
GROUP BY p.nom
ORDER BY p.nom
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 10h23   #5
Invité de passage
 
Étudiant
Inscription : décembre 2010
Messages : 5
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2010
Messages : 5
Points : 0
Points : 0
@CinePhil : J'obtiens cette erreur :
Code :
1
2
3
4
You have an error IN your SQL syntax; CHECK the manual that corresponds 
TO your MySQL server version FOR the RIGHT syntax TO USE near 
'THEN 1 ELSE 0 END) AS Info, SUM(CASE f.nom = 'Elec' THEN 1 ELSE 0 EN' 
at line 2
@Maljuna Kris :
avant de poster sur le forum j'avais lu ton article. Dans la création de la première table, il manque une virgule. Mais pour les requetes qui suivent (pour la construction du tableau) j'ai une erreur avec une "mauvaise utilisation" du ROLLUP.

Merci pour vos réponses
Thompey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 10h53   #6
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 937
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 937
Points : 17 745
Points : 17 745
il a oublié les WHEN dans le CASE.

A lire : http://sqlpro.developpez.com/cours/sqlaz/select/#L7

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/12/2010, 10h54   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 960
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 960
Points : 18 181
Points : 18 181
Envoyer un message via MSN à CinePhil
Oups ! Au temps pour moi ! SQLPro a raison !

Code :
1
2
3
4
5
6
7
8
9
SELECT p.nom, 
    SUM(CASE WHEN f.nom = 'Info' THEN 1 ELSE 0 END) AS Info,
    SUM(CASE WHEN f.nom = 'Elec' THEN 1 ELSE 0 END) AS Elec,
    SUM(CASE WHEN f.nom = 'Telecom' THEN 1 ELSE 0 END) AS Telecom
FROM client AS c
INNER JOIN filiere AS f ON f.id = c.id_filiere
INNER JOIN promo AS p ON p.id = c.id_promo
GROUP BY p.nom
ORDER BY p.nom
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/12/2010, 14h37   #8
Invité de passage
 
Étudiant
Inscription : décembre 2010
Messages : 5
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2010
Messages : 5
Points : 0
Points : 0
Merci beaucoup ! ca fonctionne !

Maintenant, j'aimerai comprendre la requête. En fait, je l'ai déjà vu à plusieurs reprises et je me demande toujours à quoi ça sert :
Code :
SUM(CASE WHEN f.nom = 'Informatique' THEN 1 ELSE 0 END) AS Info
Pourquoi faire une somme ? Et pourquoi 1 ou 0 ?

Merci pour votre aide
Thompey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 14h44   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 960
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 960
Points : 18 181
Points : 18 181
Envoyer un message via MSN à CinePhil
Si tu voulais compter le nombre d'éléments par nom de filière, un simple COUNT(*) suffirait. Là comme tu veux une colonne par nom de filière, il faut considérer chaque cas.
À chaque ligne, selon le nom de la filière, on affecte la valeur 1 ou 0 aux colonnes des filières puis le GROUP BY additionne ces chiffres. Comme on n'additionne que des 1 ou des 0, cela revient au même que de faire un COUNT(*) par filière.

L'extrait de la requête que tu as donné dans ton message peut se lire :
Dans le cas où la colonne f.nom vaut 'Informatique', j'affecte la valeur 1, sinon 0 puis je fais la somme de toutes les valeurs dans une colonne artificielle que j'appelle Info.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/12/2010, 15h44   #10
Invité de passage
 
Étudiant
Inscription : décembre 2010
Messages : 5
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2010
Messages : 5
Points : 0
Points : 0
Merci pour cette explication claire.

Maintenant, je vais faire les sommes sur les colonnes et les lignes en php parce que je ne sais pas si c'est possible ou du moins utile en SQL.
Et si je crée une view à partir de ma requete qui crée le tableau, ça va etre simple à utiliser en php.

Merci à tous de m'avoir aidé aussi rapidement.
je vais mettre le sujet en résolu.
Thompey est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 16h27   #11
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 960
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 960
Points : 18 181
Points : 18 181
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Thompey Voir le message
Maintenant, je vais faire les sommes sur les colonnes et les lignes en php parce que je ne sais pas si c'est possible ou du moins utile en SQL.
Tu veux dire "mettre le total général en bout de chaque ligne et de chaque colonne" ?

Tu peux ajouter le total par ligne dans la requête avec un simple COUNT(*) :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT p.nom, 
    SUM(CASE WHEN f.nom = 'Info' THEN 1 ELSE 0 END) AS Info,
    SUM(CASE WHEN f.nom = 'Elec' THEN 1 ELSE 0 END) AS Elec,
    SUM(CASE WHEN f.nom = 'Telecom' THEN 1 ELSE 0 END) AS Telecom,
    COUNT(*) AS Total_ligne
FROM client AS c
INNER JOIN filiere AS f ON f.id = c.id_filiere
INNER JOIN promo AS p ON p.id = c.id_promo
GROUP BY p.nom
ORDER BY p.nom
Pour le total par colonne, je ne pense pas qu'on puisse l'avoir dans la même requête alors si tu sais faire facilement en PHP, ça ne devrait pas être moins rapide qu'une seconde requête.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 16h56   #12
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 937
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 937
Points : 17 745
Points : 17 745
Citation:
Envoyé par CinePhil Voir le message
Pour le total par colonne, je ne pense pas qu'on puisse l'avoir dans la même requête alors si tu sais faire facilement en PHP, ça ne devrait pas être moins rapide qu'une seconde requête.
Si c'est possible, mais pas avec MySQL qui est très limité.

Avec n'importe quel autre SGBDR c'est un jeu d'enfant en utilisant GROUP BY CUBE ou GROUP BY ROLLUP

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 16h56   #13
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 528
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 528
Points : 3 519
Points : 3 519
Citation:
Envoyé par CinePhil Voir le message
Pour le total par colonne, je ne pense pas qu'on puisse l'avoir dans la même requête alors si tu sais faire facilement en PHP, ça ne devrait pas être moins rapide qu'une seconde requête.
WITH ROLLUP
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 17h16   #14
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 960
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 960
Points : 18 181
Points : 18 181
Envoyer un message via MSN à CinePhil
Je ne sais pas si ça me servira un jour mais merci du renseignement.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 20h54   #15
Invité de passage
 
Étudiant
Inscription : décembre 2010
Messages : 5
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2010
Messages : 5
Points : 0
Points : 0
D'accord, merci pour le renseignement. J'avais vu l'utilisation de CUBE et ROLLUP, mais ça ne marchait pas avec MySql. Maintenant je comprends mieux pourquoi !

Bonne soirée et merci à tous.
Thompey 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 10h31.


 
 
 
 
Partenaires

Hébergement Web