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 :

requéte me semble difficile


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 85
    Points : 74
    Points
    74
    Par défaut requéte me semble difficile
    salut tout le monde,
    supposons les relations:
    salle (N°salle, nom_salle, ville_salle);
    matchs(N°match, N°salle, date_match);
    participe (N°Boxeur, N°match, coin, résultat);
    Boxeur(N°Boxeur, Nom_Boxeur, poids);

    Question:

    pour chaque boxeur, afficher la moyenne des matchs gangnés (l'attribut résultats prend gagné ou perdu).

    j'ai éssayé cec i:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select N°boxeur, count(*) as total form participe
    group by N°boxeur
    
    select N°boxeur, count(*) as total_gagn form participe
    group by N°boxeu, résultat
    having résultat = 'gagné'
    je voulais diviser total_gagné sur total...
    merci d'avance

  2. #2
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Il faut utiliser une sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT P.N°boxeur, 
    (SELECT COUNT(*) FROM PARTICIPE 
      WHERE résultat = 'gagné' AND N°boxeur = P.N°boxeur)/COUNT(*)
    FROM PARTICIPE P
    GROUP BY P.N°boxeur
    Deux remarques :
    - HAVING s'utilise pour les conditions sur les champs agrégats (SUM, COUNT...), autrement il faut utiliser WHERE
    - Evite les caractères accentués ou spéciaux (°) dans les noms de champs ou de tables, ils sont souvent source d'ennuis.
    Roland

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je l'aurai fait différement avec un seul table scan :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
        N°boxeur, 
        count(*) as nb_matchs,
        sum(case résultat when 'gagné' then 1 else 0 end) as nb_victoires,
        sum(case résultat when 'gagné' then 1 else 0 end) / count(*) as ratio
    FROM PARTICIPE
    GROUP BY P.N°boxeur

  4. #4
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Tu as raison ! C'est vrai que je pense rarement au case when...
    Roland

  5. #5
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 85
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Je l'aurai fait différement avec un seul table scan :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
        N°boxeur, 
        count(*) as nb_matchs,
        sum(case résultat when 'gagné' then 1 else 0 end) as nb_victoires,
        sum(case résultat when 'gagné' then 1 else 0 end) / count(*) as ratio
    FROM PARTICIPE
    GROUP BY P.N°boxeur
    salut,
    je vous remercie beaucoup. j'ai exécuté la requueté sous le SGBD SQL Server 2000 mais la colonne "ration":prend toujours la valeurs 0!!!, je ne sais pas pour quoi??.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Parce que une division d'entier donne un entier, c'est bien connu
    Enfin tout du moins chez MS.

    Faites une conversion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
        N°boxeur, 
        count(*) AS nb_matchs,
        sum(case résultat when 'gagné' then 1 else 0 end) AS nb_victoires,
        cast(sum(case résultat when 'gagné' then 1 else 0 end) / count(*) as float) AS ratio
    FROM PARTICIPE
    GROUP BY P.N°boxeur

  7. #7
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 85
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Parce que une division d'entier donne un entier, c'est bien connu
    Enfin tout du moins chez MS.

    Faites une conversion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
        N°boxeur, 
        count(*) AS nb_matchs,
        sum(case résultat when 'gagné' then 1 else 0 end) AS nb_victoires,
        cast(sum(case résultat when 'gagné' then 1 else 0 end) / count(*) as float) AS ratio
    FROM PARTICIPE
    GROUP BY P.N°boxeur
    merci infiniment , le problème persiste pour sql server. en utlisant votre requéte (sans cast) et remplçant 1 par 1.0 et 0 par 0.0 :le problème est résolu.
    merci encore.
    juste une remarque: on peut utliser directement la fonction avg à la place de sum .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Ma requête ne semble pas vouloir fonctionner?
    Par Serghez dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 03/02/2013, 23h54
  2. [MySQL] Requête un rien difficile
    Par padoberg dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 01/07/2011, 01h44
  3. [Google Maps] Google Distance Matrix API et jQuery : la requête ne semble pas fonctionner
    Par [ZiP] dans le forum APIs Google
    Réponses: 2
    Dernier message: 19/05/2011, 08h50
  4. Requêtes un peu difficiles
    Par hayat2 dans le forum Bases de données
    Réponses: 3
    Dernier message: 02/06/2009, 11h20
  5. [AJAX] Requête qui semble cesser d'être envoyée au serveur
    Par jgfa9 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/04/2008, 00h02

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