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 :

[Debutante] Problème "Count" et "Distinct"


Sujet :

Langage SQL

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 2
    Par défaut [Debutante] Problème "Count" et "Distinct"
    Bonjour,

    Je dois réaliser une requête en SQL :
    Afficher le nombre de responsables par secteur
    en sachant que l'on dispose de deux tables :
    - SECTEUR (NomSecteur, NoSecteur)
    - MEMBRE (NoMembre, #NoRespMembre, #NoSecteur)
    avec NoRespMembre appartenant à NoMembre.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Pourriez-vous nous présenter une ébauche de la requête que vous tentez de mettre au point.
    Cela sera plus facile pour vous aider à la faire évoluer.
    En précisant le SGBD que vous utilisez et sa version, les réponses proposées seront adaptées aux spécificités et limitations de celui-ci.
    Règles du forum Langage SQL à lire par tous
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 2
    Par défaut
    Pour ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT NoSec, COUNT (NoAdh)
    FROM Adherent
    WHERE NOT EXISTS (SELECT NoAdhResp FROM Adherent)
    GROUP BY NoSec;
    ou j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT NoSec, COUNT(NoAdhResp)
    FROM Adherent
    GROUP BY NoSec;
    mais ça n'affiche justement les adhérents qui ne sont pas responsables.

    J'utilise Microsoft Access 2007.

    Merci d'avance

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    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 997
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT #NoSecteur, COUNT(DISTINCT #NoRespMembre)
    FROM   MEMBRE
    GROUP  BY #NoSecteur
     
    -- pour avoir le secteur en clair : ajouter une jointure
    SELECT #NomSecteur, COUNT(DISTINCT #NoRespMembre)
    FROM   MEMBRE M
           INNER JOIN SECTEUR S
                 M.#NoSecteur = S.NoSecteur
    GROUP  BY #NoSecteur
    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/ * * * * *

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Par défaut
    bonjour,

    Dans SQL Access, <Distinct Count> n'existe pas, il faut donc 2 requêtes :
    1) Regrouper les responsables par secteur pour éviter les doublons
    2) Compter les responsables par secteur

    Ou regrouper le tout en une seule via une sous-requête dans la clause From :
    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
     
    SELECT
     secteur.NomSecteur,
     COUNT(R1.NoRespMembre) AS CompteResp
    FROM
     [
    SELECT
     NoSecteur,
     NoRespMembre
    FROM
     Membre
    GROUP BY
     NoSecteur,
     NoRespMembre]. AS R1
    INNER JOIN
     secteur
     ON
      R1.NoSecteur=secteur.NoSecteur
    GROUP BY
     secteur.NomSecteur;
    ou une sous-requête pour faire le Distinct Count :
    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
     
    SELECT
     Membre.NoSecteur,
     (
    SELECT
     COUNT(NoRespMembre)
    FROM
     (
    SELECT DISTINCT
     NoSecteur,
     NoRespMembre
    FROM
     Membre AS R1)
    WHERE
     R1.NoSecteur=Membre.NoSecteur) AS CompteResp
    FROM
     Membre
    GROUP BY
     Membre.NoSecteur;
    Cordialement,

    Philippe

    Dans le cas particulier ou NoMembre = NoRespMembre pour tous les responsables, c'est à dire que les responsables sont responsable d'eux-même , la requete peut se simplifier ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT
     NoSecteur,
     COUNT(NoRespMembre) AS CompteResp
    FROM
     Membre
    WHERE
     NoMembre=[NoRespMembre]
    GROUP BY
     NoSecteur;

Discussions similaires

  1. Problème avec count(distinct)
    Par habasque dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 28/10/2009, 16h54

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