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 :

Count (*) et join


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Count (*) et join
    Bonjour,

    Je souhaite faire une requête SQL et la solution que j’ai trouvée ne me parait pas top. J’aimerai savoir si vous n’avez pas mieux à proposer.

    J’ai renommé les tables, les champs et réduit le nombre de champs pour simplifier.

    Je voudrais récupérer le code client, le nom du client, le nombre de numéros de téléphone de chaque client en sachant que les clients peuvent avoir 0 à n téléphones.

    Voici les tables et les champs :
    - CLIENT : CLI_CODE, CLI_NOM
    - TELEPHONE_CLIENT : TCLI_CODE, TCLI_NUMERO_TEL

    Voici la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CLI_CODE, CLI_NOM, COUNT(*) AS NombreTel
    FROM CLIENT LEFT OUTER JOIN TELEPHONE_CLIENT
    ON CLI_CODE = TCLI_CODE
    WHERE CLI_CODE = 'CLT1'
    GROUP BY CLI_CODE, CLI_NOM
    Ca semble fonctionner avec d’éditeur de requêtes de Visual Studio 2015 sur une base SQL Server Express.

    Mais je n'ai pas encore eu le temps de remplir correctement mon jeu de test (je vais le faire juste après l'envoi de cette question). J'ai juste un client avec plusieurs téléphones.

    Mais pourquoi poser une question si ça fonctionne me direz vous ?

    C'est que pour pouvoir récupérer le nom du client, j'ai dû ajouter le nom dans le group by. D'autant plus que je vais devoir récupérer environ une dizaine d'autres champs de la table client. Ca va faire un gros group by.

    Merci d'avance pour vos suggestions.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Ne fonctionnait pas + solution
    Bon finalement, ça ne fonctionnait pas: ça renvoyait 1 téléphone même lorsqu'il n'y avait pas d'enregistrement correspondant au client dans la table TELEPHONE_CLIENT.

    Mais j'ai trouvé la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT CLI_CODE, CLI_NOM, NombreTel
    FROM CLIENT
    LEFT JOIN (SELECT TCLI_CODE, count(*) AS NombreTel FROM TELEPHONE_CLIENT GROUP BY TCLI_CODE) b ON CLI_CODE = b.TCLI_CODE
    ORDER BY CLI_CODE ASC
    Bonne soirée à tous.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Lien à l'origine de la solution
    Pour info, j'ai trouvé la solution sur http://www.developpez.net/forums/d94...le-count-join/.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Le problème dans le fil que vous évoqué est un peu différent du votre, puisqu'il s'agit d'aller chercher puisqu'il y a une jointure supplémentaire susceptible de multiplier les lignes (s'il y a 2 breves et 3 notes, chaque note sera comptée deux fois et chaque breve 3 fois du fait de la jointure).

    Ce n'est pas votre cas, et votre requete initiale était presque correcte, et évitait la sous requete.

    ça renvoyait 1 téléphone même lorsqu'il n'y avait pas d'enregistrement correspondant au client dans la table TELEPHONE_CLIENT
    Pour résoudre ce problème, il suffit de prendre en compte ce qui suit :
    - COUNT(*) compte le nombre de lignes
    - COUNT(UneColonne) Compte le nombre de lignes UneColonne est non NULL.

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

Discussions similaires

  1. [MySQL] Multiplier/additionner des COUNT en JOIN LEFT?
    Par kfa1983 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/03/2011, 16h35
  2. Multiple count et join
    Par levalp dans le forum Requêtes
    Réponses: 11
    Dernier message: 22/06/2010, 15h48
  3. count et join de deux tables
    Par crazyvirus dans le forum Requêtes
    Réponses: 1
    Dernier message: 12/03/2010, 05h52
  4. multiples COUNT et JOIN
    Par Ryle dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/08/2004, 08h26
  5. count() dans *plusieurs* LEFT JOIN
    Par silver_dragoon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2004, 17h20

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