IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Sélectionner des colonnes qui dépendent d'une requête


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 5
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Pays.codePays
    FROM Pays;
    Et je ne sais absolument pas comment combiner les deux..

    Une idée ?

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    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.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 5
    Par défaut
    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.

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    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.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 5
    Par défaut
    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

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    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
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 : 16 818
    Billets dans le blog
    14
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2014, 01h01
  2. Macro qui sélectionne des colonnes spécifiques
    Par nyto35 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/04/2013, 15h41
  3. Réponses: 1
    Dernier message: 28/08/2009, 02h45
  4. Réponses: 6
    Dernier message: 11/12/2007, 17h55
  5. Réponses: 3
    Dernier message: 21/06/2005, 11h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo