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 :

probleme de requete


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut probleme de requete
    Bonjour, voila j'ai plusieurs requetes a effectuer et j'avoue que je cale un peu.

    voici mes tables:

    table joueur

    nujoueur | nom | prenom | annaiss | nationalite

    table gain

    nujoueur | lieutournoi | annee | prime | sponsor

    table rencontre

    nugagnant | nuperdant | lieutournoi | annee

    voici les requetes que je dois trouver

    1)valeur de la plus forte prime attribué lors d'un tournoi en 1992 et noms des joueurs qui l'ont touchée.

    2)noms et prenoms des vainqueurs du simple homme et simple dame du tournoi de roland garros en 1992

    3)noms des joueurs ayant participé a tous les tournois de roland garros

    4)noms des sponsor représentés a tous les tournois

    5) noms des pays qui ont eu un vainqueur de tournoi chaque année

    voila j'ai essayé plusieurs truc mais je sais pas pourquoi je cale sur ces requetes.

    Merci a l'avance pour votre aide.
    sgbd : oracle

  2. #2
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Hum ce serait pas des devoirs ca ?
    1) SELECT MAX(PRIME) FROM GAIN WHERE ANNEE=1992

    2) Heu le sexe je dois le retrouver d'apres le prénom ....

    3) A toi de faire la suite de l'exo

    4) A toi de faire la suite de l'exo

    5) A toi de faire la suite de l'exo
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    ba en faite c'est des requetes qu'on peut faire si on veut mais c'est pas obligé c'est pour s'entrainer. Et comme j'ai envie d'apprendre le sql je veux les faire et les comprendre.

    1) je suis d'accord a moitié car il faut faire une jointure avec la table joueur et la table gain en incluant ta requete et c'est la que j'ai un soucis( je pense qu"il faut faire un group by aussi)

    mais merci pour ta reponse.

  4. #4
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Pourquoi te faut-il une jointure tu veux la valeur pas le nom du joueur ou le tournoi
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  5. #5
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    dsl j'avais apas vu la fin de la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT j.NOM, j.PRENOM, g.PRIME
    FROM JOUEUR j, GAIN g
    WHERE j.NUJOUEUR = g.NUJOUEUR     
       AND g. PRIME= (   SELECT MAX(PRIME) FROM GAIN WHERE ANNEE=1992 )
       AND g.ANNEE=1992
    )
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    merci elle affiche bien les bons résultats mais quelqu'un aurais une idée pour la question 3 car c'est ce genre de requete où j'ai du mal (quand y a un "tous les "...).

    merci.

    ps : je ne demande pas forcément qu'on me donne la requete toute faite mais une idée comment la faire.

  7. #7
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    3) Une idée serait de compter le nombre de rencontre correspondant à Roland garros (COUNT), puis de compter le nombre de fois ou un joueur est aller a roland garros puis de sortir tous ceux dont les 2 count sont identiques.

    4) idem dans l'idée compter le nbre de tournoi puis .....
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  8. #8
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    merci , ba j'ai reussi a compter le nombre de tournoi de roland garros :

    1)-select count(distinct annee) from gain where lieutournoi='roland garros';

    puis compter le nombre de fois qu'une personne a participé a rolland garros :
    2) select count(nujoueur) from gain where lieutournoi='roland garros' group by nujoueur;

    mais comment je fais pour recuperer les numero des joueurs où 1) =2)

    Merci

  9. #9
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    regarde du coté du mot clé HAVING cela devrait t'aider.
    Sinon tu peux egalement faire une sous-requête comme je l'ai fait pour 1.
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  10. #10
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    oui mais avec having je ne peux pas faire par exemple having( select count ...)=select count(... ) et avec des select imbriqué pour l'instant je ne vois pas,je cherche.

    merci

  11. #11
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    ca y ai j'ai réussi la 3ème question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select nujoueur 
      from gain 
     where lieutournoi='roland garros' 
     group by nujoueur 
    having count(nujoueur)=(select count(distinct annee) from gain where lieutournoi='roland garros');
    merci beaucoup maintenant celui qui a une idée pour la 5) ca serait cool

    merci pour vos aides,j'arrive a m'en sortir maintenant.

    Balise Code et formattage requêtes powered by Xo, merci d'y penser

  12. #12
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    je viens de réussir la 2) :

    select distinct j.nom,r.lieutournoi,r.annee from joueur j,rencontre r
    where j.nujoueur=r.nugagnant
    and r.annee=1992
    and r.lieutournoi='roland garros'
    and j.nujoueur not in(select r2.numperdant from rencontre r2 where r2.lieutournoi=r.lieutournoi and r2.annee=r.annee);

    mais je lutte un peu pour la 4) et 5) . ze_key ,je ne vois pas trop comment tu veux faire pour la 4) en comptant le nombre de tournoi etc .

  13. #13
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Tout d'abord j'ai l'impression que la 2) est un piege, car tu n'as pas de notion de simple ou de double sur la db et non d'homme ou de femme.
    4) Compter les tournois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT COUNT( DISTINCT( LIEUTOURNOI)  ) 
    FROM GAIN
    Puis compter le nbr de tournois diff par spnsors
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  14. #14
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    merci mais je n'y arrive vraiment pas pour la 4) je laisse tomber .

    pour la 2) il faut juste selectionner les vainqueurs du tournoi a roland garros en 1992 puisque forcément il n 'y a qu'un vainqueur dc la requete me renvoi les vainqueurs homme et femme.

    Merci ,manque plus que la 5) et c'est bon mais elle a l'air baleze comme meme la 5.

  15. #15
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Bonjour,

    Pour la 4 j'arrive pas à faire plus simple que ça.
    J'ai créé ttes les combinaisons possibles (ie ts les sponsors participent à ts les tournois),
    j'ai croisé avec la 'réalité' (ie les sponsors ayant participé aux tournois),
    et enfin je ne garde que ceux qui n'ont [pas [pas participé]] à au moins 1 tournoi (ie qui n'ont pas de tournoi = null)

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    SELECT sponsor
    FROM gain
    WHERE sponsor NOT IN 
    (
    SELECT tournoi.sponsor
    FROM
    (
    SELECT 	g1.annee,
    	g1.lieutournoi,
    	g2.sponsor
    FROM	gain g1
    CROSS JOIN gain g2
    GROUP BY g1.annee,
    	g1.lieutournoi,
    	g2.sponsor
    ) AS tournoi
    LEFT OUTER JOIN gain
    ON 	tournoi.annee = gain.annee
    AND	tournoi.lieutournoi = gain.lieutournoi
    AND	tournoi.sponsor = gain.sponsor
    WHERE 	gain.annee IS NULL
    OR	gain.lieutournoi IS NULL
    )
    GROUP BY sponsor
    ;
    Au fait dans ta requête 2 pourquoi tu rajoutes
    and j.nujoueur not in(select r2.numperdant from rencontre r2 where r2.lieutournoi=r.lieutournoi and r2.annee=r.annee);
    c'est redondant avec
    where j.nujoueur=r.nugagnant
    and r.annee=1992
    and r.lieutournoi='roland garros'
    ou me trompe-je?

    A +

  16. #16
    Membre régulier
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Points : 84
    Points
    84
    Par défaut
    merci pour ta requete mais j'y comprends rien!! lol (trop balez pour moi )

    pour la 2) en faite il faut selectionner les joueurs qui n'ont jamais perdu une seule rencontre dans un meme tournoi la meme année.

    voila ,en tout cas merci beaucoup.

  17. #17
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    re,

    Pour ma remarque sur la 2, tu as raison, je me suis aperçu que je disais une ânerie au moment ou je cliquais sur ''envoyer''. J'avais compris qu'il n'y avait que le résultat de la finale.
    Pour la 4 il y a peut-être plus simple, je l’ai faite ‘au feeling’…

    A +

  18. #18
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Re,

    J'ai voulu faire plus simple en partant de la suggestion de
    Citation Envoyé par ze_key
    4) Compter les tournois:
    ... mais je ne suis pas sur que ce soit réussi
    Je me demande si je ne suis pas 1 peu tordu ?
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    SELECT 	sponsor
    FROM	gain g
    WHERE	
    (
    SELECT COUNT (*)
    FROM
    (
    SELECT DISTINCT sponsor,
    	annee,
     	lieutournoi
    FROM 	gain 
    WHERE	gain.sponsor = g.sponsor
    ) AS nbtournois
    ) 
    =
    (
    SELECT COUNT (*)
    FROM
    (
    SELECT DISTINCT annee,
     	lieutournoi
    FROM 	gain
    ) AS nbtournois
    ) 
    GROUP BY sponsor
    ;

  19. #19
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    La solution que l'on vous à donné à la une est fausse... Elle ne donne pas le gagnant et l'énoncé de la question précise les joueurs. Voici une démo de la solution :

    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
    16
    17
    18
    19
    CREATE table joueur 
    (nujoueur     INTEGER, 
     nom          VARCHAR(8),
     prenom       VARCHAR(8),
     annaiss      INTEGER,
     nationalite  CHAR(3))
     
    CREATE table gain
    (nujoueur     INTEGER, 
     lieutournoi  VARCHAR(8),
     annee        INTEGER,
     prime        FLOAT,
     sponsor      VARCHAR(8))
     
    CREATE table rencontre
    (nugagnant    INTEGER,
     nuperdant    INTEGER,
     lieutournoi  VARCHAR(8),
     annee        INTEGER)
    1) valeur de la plus forte prime attribué lors d'un tournoi en 1992 et noms des joueurs qui l'ont touchée.

    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
    16
    17
    18
    19
    20
    21
    22
    1.1 la plus forte prime en 1992 :
    SELECT MAX(g.prime) 
    FROM   gain g
    WHERE  g.annee = 1992
     
    1.2 le tournoi de la plus forte prime en 1992 :
    SELECT MAX(g.prime) 
    FROM   gain g
           INNER JOIN rencontre r ON g.lieutournoi = r.lieutournoi AND g.annee = r.annee 
    WHERE  g.annee = 1992
     
    1.3 le nom des joueurs du tournoi de la plus forte prime en 1992 :
     
    SELECT j1.nom AS GAGNANT, j2.nom AS PERDANT, g.prime
    FROM   rencontre r
           INNER JOIN gain g    ON r.lieutournoi = g.lieutournoi AND r.annee = g.annee 
           INNER JOIN joueur j1 ON r.nugagnant = j1.nujoueur 
           INNER JOIN joueur j2 ON r.nugagnant = j2.nujoueur 
    WHERE  g.prime = (SELECT MAX(g2.prime) 
                      FROM   gain g2
                      WHERE  g2.annee = 1992
                        AND  r.annee = g2.annee)
    Les requêtes 3, 4 et 5 sont des divisions relationnelles. Lire l'article que j'ai écrit à ce sujet pour maitriser les techniques d'écriture de cet opérateur :
    http://sqlpro.developpez.com/cours/divrelationnelle/

    La 2 n'est pas réalisable : il manque une donnée !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. probleme de requete
    Par doudou1 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/04/2004, 13h42
  2. probleme avec requete sql aime pas les strings
    Par lil_jam63 dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/02/2004, 14h45
  3. PROBLEME DE REQUETE IMBRIQUEE
    Par fleuve007 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/12/2003, 15h33
  4. probleme de requete
    Par LineLe dans le forum ASP
    Réponses: 8
    Dernier message: 17/09/2003, 16h47
  5. Probleme de requete
    Par misterbillyboy dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/07/2003, 08h24

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