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 :

Quelques requêtes sql


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
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut Quelques requêtes sql
    Bonjour à tous ;

    J'aurais voulu avoir svp votre aide afin de construire quelques requêtes sql car étant débutant dans ce domaine je me heurte à des petites difficultés. Ce qui m'intéresse particulièrement, ce sont les explications ; un bref commentaire sur une requête que vous me proposerez sera bien plus efficace que la requête présentée seule, c'est ce qui va m'aider à faire le déclic.
    Je vous remercie d'avance pour votre aide. Je vous présente un extrait d'un modèle relationnel :

    PILOTE (idPilote, nom, prenom, dateDeNaissance, idPays)
    idPilote : clé primaire
    idPays : clé etrangère en réf à idPays de Pays

    COURSE (dateCourse, idPays)
    dateCourse : clé primaire

    CLASSEMENT (idPilote, dateCourse, positionDep, positionArr)
    idPilote, dateCourse :clés primaires
    idPilote : clé etrangère en ref à idPilote de Pilote
    dateCourse : clé etrangère en réf à dateCourse deCourse

    ECURIE (idEcurie, nomEcurie, dateCreation)
    idEcurie : clé primaire

    Voilà, à partir de là, il nous est proposé de donner la liste des pilotes qui ont plus de 3 courses non terminées en 2010 en affichant également le nombre de ces courses. (à savoir qu'une course non terminée est caractérisée par une absence de valeur saisie dans positionArr)

    Je vous mets la requête que j'ai "pondue"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT nom, prenom, positionArr
    FROM pilote NATURAL JOIN classement
    WHERE SELECT (positionArr IS NULL
                          FROM classement
                          ) > 3
    Je suis certain qu'elle est maladroite, si vous pouvez me l'arranger svp...

    Et pour finir, une autre requête assez complexe je pense, si vous pouvez m'aiguiller ça m'avancerait bien svp... alors, il est demandé de donner l'écurie qui a le plus de victoires à son palmarès (nom & nombre). Comment procéderiez-vous par ex ?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Bonjour,

    Je pense que cette requête doit répondre à ta demande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT P.idPilote, P.nom, P.prenom, SUM(CASE WHEN C.positionArr = NULL THEN 1 ELSE 0) AS Nbre
    FROM PILOTE P
      INNER JOIN CLASSEMENT C ON C.idPilote = P.idPilote
    GROUB BY P.idPilote, P.nom, P.prenom
    HAVING SUM(CASE WHEN positionArr = NULL THEN 1 ELSE 0) > 3
    Je n'ai pas tester, pas le courage de créer les tables nécessaires.

    Dans une jointure, il semble indispensable de surnommer les tables P et C dans l'exemple.

    Pour totaliser le nombre d'abandons, il est impossible d'utilier Count(*), car il prend pas en compte les NULL. Il faut donc utiliser un test de condition qui ajoute 1 pour chaque valeur de positionArr NULL.

    Si la requête comprend un agrégat, il est nécessaire de mettre la clause GROUP BY qui permet le regroupement des informations de cumul. Cette clause doit comporter tous les éléments à l'exception des agrégats.

    La clause HAVING permet de créer le filtre pour ne présenter que les pilotes qui ont plus de trois abandons.

    Pour la 2ème question, essaies de présenter une requête, nous la corrigerons si nécessaire.

    Pour te documenter plus complétement, tu as ce site http://sqlpro.developpez.com/

    A+

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Citation Envoyé par seabs Voir le message
    Pour totaliser le nombre d'abandons, il est impossible d'utilier Count(*), car il prend pas en compte les NULL. Il faut donc utiliser un test de condition qui ajoute 1 pour chaque valeur de positionArr NULL.
    Non, il est tout à fait possible d'utiliser count(*), que des champs soient à NULL ou pas.

    En revanche dans ta requête, les conditions du genre C.positionArr = NULL ne peuvent jamais être vraies, c'est justement l'erreur à ne pas faire avec les NULL.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    592
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 592
    Par défaut
    Bonjour,

    estofilo
    En revanche dans ta requête, les conditions du genre C.positionArr = NULL ne peuvent jamais être vraies, c'est justement l'erreur à ne pas faire avec les NULL.
    Effectivement, il s'agit d'une erreur impardonnable, ma requête devrait être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT P.idPilote, P.nom, P.prenom, SUM(CASE WHEN C.positionArr IS NULL THEN 1 ELSE 0 END) AS Nbre
    FROM PILOTE P
      INNER JOIN CLASSEMENT C ON C.idPilote = P.idPilote
    GROUB BY P.idPilote, P.nom, P.prenom
    HAVING SUM(CASE WHEN C.positionArr IS NULL THEN 1 ELSE 0 END) > 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Non, il est tout à fait possible d'utiliser count(*), que des champs soient à NULL ou pas.

    C'est exact, count(*) compte le nombre de lignes. Il serait donc plus judicieux d'écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT P.idPilote, P.nom, P.prenom, COUNT(*) AS Nbre
    FROM PILOTE P
      INNER JOIN CLASSEMENT C ON C.idPilote = P.idPilote
    WHERE C.positionArr IS NULL
    GROUB BY P.idPilote, P.nom, P.prenom
    HAVING COUNT(*) > 3
    Autant pour moi.

    A+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut
    MCela parait tellement évident une fois la requête construite, mais le plus dur est d'en arriver là justement.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut
    Merci beaucoup à tous pour vos interventions. Mais est-ce qu'il n'y aurait pas une méthodologie particulière pour bien réussir ce genre d'exercices (en dehors de l'expérience et de l'aspect réflexion) ?

    Dans le monde professionnel, les requêtes sont de ce niveau assez complexe ou c'est plus simple ?

    A présent, si ça ne vous dérange pas, pourriez-vous m'aider svp pour construire une requête donnant l'écurie qui a le plus de victoires à son palmarès (nom et nombre) ?

    Là, je n'ai vraiment aucune idée de comment procéder car je ne vois pas comment relier ECURIE à une autre table vu qu'il n'y a aucune CIF, association, ou lien identifient. Je ne demande pas vraiment la solution mais juste un indice permettant le départ et un déclic... si possible
    J' y ai pourtant passé du temps mais sans résultat...

    Merci d'avance

Discussions similaires

  1. Requête SQL
    Par Leludo dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/07/2024, 16h41
  2. [ DB2 ] [ AS400] requête sql
    Par zinaif dans le forum DB2
    Réponses: 6
    Dernier message: 23/08/2008, 20h42
  3. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 19h38
  4. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 17h26
  5. PB requète SQL avec Interbase
    Par missllyss dans le forum InterBase
    Réponses: 2
    Dernier message: 15/07/2003, 12h37

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