Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 14/10/2011, 09h58   #1
Invité de passage
 
Inscription : août 2005
Messages : 5
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 5
Points : 0
Points : 0
Par défaut Sélectionner des colonnes qui dépendent d'une requête

Bonjour tout le monde !

J'ai un petit problème que je n'arrive pas à résoudre seul, je sollicite votre aide

J'ai 3 tables : films,genres,pays.
A chaque film correspond un genre et un pays.
A chaque film correspond également le nombre d'entrées.

J'aimerai, pour chaque genre distinct, obtenir :
Le nom du genre, la somme des entrées pour les films de ce genre, la somme des entrées pour ce genre dans le pays 1, la somme des entrées pour ce genre dans le pays 2, la somme des entrées pour ce genre dans le pays 3, etc...

Donc, sans la partie en rouge, je m'en sors très bien comme ça :

Code :
1
2
3
4
5
SELECT genres.intituléGenre, Sum(films.entrees) AS [Total des entrées)]
 
FROM Pays INNER JOIN (genres INNER JOIN films ON genres.codeGenre = films.codeGenre) ON Pays.codePays = films.PAYS
 
GROUP BY [Genres des films].intituléGenre;
Mais voilà, pour la partie en rouge, le nombre et le nom des colonnes dépend d'une requête du style :
Code :
1
2
SELECT Pays.codePays
FROM Pays;
Et je ne sais absolument pas comment combiner les deux..

Une idée ?
socomajor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 10h45   #2
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Il faut juste faire une jointure supplémentaire sur Pays avec Films.

Ensuite, soit tu ramène en colonne le code pays, soit tu fais N requête en mettant à chaque fois "where pays.code = 1", puis 2, 3, etc. l'énoncé n'est pas très clair.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 11h36   #3
Invité de passage
 
Inscription : août 2005
Messages : 5
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 5
Points : 0
Points : 0
Merci de ta réponse : je précise l'énoncé :

En fait, le nombre de pays (et donc de colonnes et rouge) n'est pas connu à l'avance, il dépend du nombre d'entrées dans la table Pays.

C'est là tout mon problème, je ne sais pas comment faire une requête avec un nombre de colonnes qui dépend d'une autre table.
socomajor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 11h46   #4
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projets Générix
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Ca, c'est "impossible".

Je mets entre guillemets car :
- En SQL "pur", on peut contourner en mettant un nombre défini en dur et LEFT OUTER JOIN sur une liste en dur de code pays : c'est crade.
- Avec MySQL (peut-être d'autres SGBD) il y a une fonction qui permet de transformer des lignes en colonne. C'est pas standard, mais si c'est un TP sur MySQL, c'est peut-être ce qu'attends ton prof.

Sinon, la solution universelle, standard SQL, c'est de ramener la liste des pays sous forme de ligne : c'est à dire que tu éclates le résultat par pays, avec les données par pays sur chaque ligne.
=> C'est alors à l'application client de faire les cumul et l'affichage en colonnes.

A ce moment, il suffit de rajouter la jointure sur pays et de rajouter une colonne code pays, et l'intégrer dans le group by.
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 11h50   #5
Invité de passage
 
Inscription : août 2005
Messages : 5
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 5
Points : 0
Points : 0
C'est un effet un TP (avec MS Access..)

Merci beaucoup pour les infos
Je vais voir ce que je peux faire avec ça !

(je soupçonne le prof d'avoir entré manuellement chaque pays dans sa requête pour obtenir son résultat, même si c'est pas du tout dans l'esprit du TP).

Merci encore
socomajor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 12h28   #6
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 545
Points : 7 545
Avec Access, tu peux utiliser la clause PIVOT, qui n'existe pas dans la norme SQL.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/10/2011, 13h05   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Puisque c'est un TP avec Access, je suppose que tu dois (ou que tu as le droit) d'utiliser le résultat de la requête dans un formulaire ?

La manière la plus rationnelle est alors de faire la requête suivante :
Code :
1
2
3
4
5
6
7
8
SELECT genres.intituléGenre, Pays.codePays, Sum(films.entrees) AS [Total des entrées)]
FROM Pays 
INNER JOIN (
	genres 
	INNER JOIN films ON genres.codeGenre = films.codeGenre
) ON Pays.codePays = films.PAYS
GROUP BY genres.intituléGenre, Pays.codePays
ORDER BY genres.intituléGenre, Pays.codePays
Tu auras ainsi le nombre d'entrées par genre et par pays et dans le formulaire, tu t'arranges pour avoir les pays en colonne et les genres en ligne avec un total général en bas de tableau.

Car vouloir mettre les pays en colonne avec SQL, c'est vouloir faire de la cosmétique, ce qui n'est pas le boulot du SGBD mais du logiciel qui présente les données - dans ton cas, les formulaires ou états Access.
__________________
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 déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h14.


 
 
 
 
Partenaires

Hébergement Web