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 :

Aide sur requête SQL


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 34
    Points : 13
    Points
    13
    Par défaut Aide sur requête SQL
    Bonjour,

    Je galère pas mal dans la conception d'une requête sur un schéma de bdd assez tordu.

    Voici le schéma:
    SPORTS_DISPO (ID, NOM)
    MOUVEMENTS_POSSIBLES (ID, NOM, SPORTS_DISPO_ID)
    SALLE_SPORT (ID, NOM, SPORTS_DISPO_ID, DATE)
    CLIENT (ID, NOM)
    MOUVEMENTS_EFFECTUES (ID, NOM, SALLE_SPORT_ID, MOUVEMENTS_POSSIBLES_ID, CLIENT_ID)

    La requête est:
    Lister tous les clients actuels avec le nombre de mouvements effectués au total pour tout sport effectués par chaque client dans toute les salles de sport visitées (en ne prenant en compte que la dernière visite en date pour chacune des salles), et le nombre de mouvements possibles au total pour les sports effectués pour chaque client.

    Bon je galère pas mal, donc si quelqu'un pouvait me donner un coup de main. Le schéma de la table ne peut être modifié.

    Oui ça n'a pas vraiment de sens, mais j'en ai besoin :/

  2. #2
    Membre actif Avatar de copin
    Homme Profil pro
    Webmaster
    Inscrit en
    Mai 2005
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2005
    Messages : 231
    Points : 244
    Points
    244
    Par défaut
    salut,

    Citation Envoyé par Pschittt Voir le message
    La requête est:
    Lister tous les clients actuels avec le nombre de mouvements effectués au total pour tout sport effectués par chaque client dans toute les salles de sport visitées (en ne prenant en compte que la dernière visite en date pour chacune des salles), et le nombre de mouvements possibles au total pour les sports effectués pour chaque client.
    Euh... je comprends rien du tout à la requête que tu veux faire... Tu pourrais pas essayer de reformuler ca, si tu veux qu'on t'aide.

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 34
    Points : 13
    Points
    13
    Par défaut
    Tentative de reformulation:

    Les salles de sports (SALLE_SPORT) proposent plusieurs sports (SPORTS_DISPO)

    Dans chaque sports (SPORTS_DISPO) on peut effectuer des mouvements précis (MOUVEMENTS_POSSIBLES).

    Parmi ces mouvements possibles, un client n'est pas obligé de tous les faire lorsqu'il fait son sport, il fait donc certain mouvement (MOUVEMENTS_EFFECTUES) parmi les mouvements possibles (MOUVEMENTS_DISPO).

    Un client peut aller dans différente salles de sports (SALLE_SPORT) pour faire un sport.

    La requête doit lister tous les clients actuels. Et pour chaque client, on doit avoir le compte/nombre de mouvements effectués au total. Sauf qu'une salle de sports ne doit être prise en compte qu'une seule fois, et il s'agit de la dernière fois en date que le client y est allé. On doit aussi récupéré le compte/nombre de mouvements au total qu'il aurait pu faire, donc en gros le compte total des mouvements dispo (MOUVEMENTS_DISPO) pour les sports qu'il a effectué. Attention, normalement un sport ne revient qu'une seule fois.

    Bon j'espère que c'est plus clair. Sinon n'hésitez pas à me redemander.

  4. #4
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 73
    Points
    73
    Par défaut
    Le schéma n'est en effet probablement pas optimal, je distinguerais bien la notion de salle de sport de la visite d'une salle par un client. Le problème vient du fait que la même salle de sport utilisée 2 fois à des dates différentes apparait comme 2 entrées avec le même id soit absence de clef primaire sur la table, si je comprends bien.

    Mais passons, je vais tout de même m'essayer à une requête qui j'espère te donnera, sinon exactement le résultat que tu attends, au moins une piste pour l'obtenir. Je détaille les étapes de construction de la requête pour que ça soit au maximum réutilisable et pour que, en cas d'erreur (fort probable sachant que je n'ai pas de SGBD sous le coude pour tester ce que j'écris) tu puisses trouver la correction.

    Procédons par ordre:
    1/ La dernière visite de chaque client dans chaque salle de sport, c'est à dire l'ensemble des visites dans les salles de sport de tous les clients pour lesquelles il n'existe pas de visites plus récentes dans la même salle pour le même client.
    2/ les mouvement effectués n'étant pas distingués des visites, on peut directement compter les entrées par client
    3/ On rapproche (jointure) ce résultat du nombre de mouvement effectuables pour chaques sports (tables MOUVEMENT_DISPO)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT C."ID", C."NOM", COUNT(DISTINCT(ME."ID")), COUNT(MD."ID")
    FROM CLIENT C 
             INNER JOIN MOUVEMENTS_EFFECTUES ME ON ME."CLIENT_ID"=C."ID"
             INNER JOIN SALLE_SPORT SS1 ON SS1."ID"=ME."SALLE_SPORT_ID"
             INNER JOIN MOUVEMENTS_DISPO MD ON MD."SPORTS_DISPO_ID"=SS1."SPORTS_DISPO_ID"
    WHERE NOT EXISTS(
             SELECT 1
             FROM SALLE_SPORT SS2
                      INNER JOIN MOUVEMENTS_EFFECTUES ME2 ON SS2."ID"=ME2."SALLE_SPORT_ID"
     
             WHERE SS2."DATE" > SS1."DATE"
                       AND SS2."ID"=SS1."ID"
                       AND ME2."CLIENT_ID"=ME."CLIENT_ID"
    )
    GROUP BY C."ID", C."NOM"

    cela n'est valable que si mon interprétation de table SALLE_SPORT est correcte.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 13
    Points : 9
    Points
    9
    Par défaut
    Bonjour

    Dans la formulation il y a certains éléments qui semblent contradictoire par rapport au schéma :

    • Il faut compter le dernier mouvement effectué mais il n'y a pas de date dans les mouvements effectués
    • Il y a une date sur la salle de sport, à quoi sert elle ?


    D'autre part je ne comprends pas le concept de "mouvements_ possibles"
    Serait il possible d'avoir des exemples ?

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 34
    Points : 13
    Points
    13
    Par défaut
    @J_F_B: merci pour la requête, mais elle ne donne pas le résultat que je souhaite.

    Je vais essayé d'être plus précis.

    Pour la date du dernier mouvement effectué, on le voit dans la date de la salle de sport.

    En fait je pense qu'il faut faire comme suit, mais je n'arrive pas à la traduire en SQL:
    1) Récupéré la liste de tous les clients
    2) Récupéré toutes les salles de sports dans lesquelles les clients sont passés (attention il faut distinguer pour chaque client).
    3) Il faut récupéré toutes les salles de sports mais la dernière visite en date. Donc si un client est passé 2 fois dans une même salle, on ne récupère que la dernière visite.
    4) Dans ces salles de sports, le client a effectué plusieurs mouvements (MOUVEMENTS_EFFECTUES) il faut donc en faire le compte. Ainsi que le nombre total de mouvements qu'il aurait pu faire.

    Et tout ça faut que ça soit par client.

    Donc normalement à la fin de la requête, on devrait avoir un truc du genre:
    CLIENTS(nom ou id) Mouvements effectués Mouvements_total
    client1 5 28
    client2 14 53
    client3 12 28

    Ceci est un exemple de résultat. J'espère que c'est plus clair.

  7. #7
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 73
    Points
    73
    Par défaut
    avec le script de création des tables et quelques données exemples, ça serait plus facile de comprendre exactement le schéma pour te donner une réponse plus précise

  8. #8
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !


    [EDIT]
    Attends, en relisant, j'ai l'impression que je suis passé à côté d'un truc
    (j'y réfléchis, et je reviens)

  9. #9
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 34
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Salut !


    [EDIT]
    Attends, en relisant, j'ai l'impression que je suis passé à côté d'un truc
    (j'y réfléchis, et je reviens)
    Justement j'allais te répondre, il y avait un problème sur une jointure dans la 2e requête

Discussions similaires

  1. Aide sur requête SQL
    Par Marco94 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 08/07/2010, 17h53
  2. Besoin d'aide sur requête Sql
    Par Sekigawa dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 31/12/2009, 15h14
  3. Aide sur requête SQL
    Par Mister Paul dans le forum Langage SQL
    Réponses: 14
    Dernier message: 27/10/2008, 11h22
  4. aide sur requête sql
    Par Vodkha dans le forum Langage SQL
    Réponses: 9
    Dernier message: 30/08/2005, 17h53
  5. Aide sur Requête SQL
    Par devdev dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/05/2005, 12h33

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