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

Requêtes et SQL. Discussion :

Plusieurs Count() selon critère dans une requête SQL [AC-2010]


Sujet :

Requêtes et SQL.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 49
    Par défaut Plusieurs Count() selon critère dans une requête SQL
    Bonjour,

    Je vous expose mon problème. Je possède 3 tables : Continent, Pays et Clients



    Chaque client possède donc un nom, une "relation" qu'il a avec nous (on peut considérer ca comme une note de A à D) et un pays. Voici ma table :




    Maintenant, je souhaite avoir un tableau qui me récapitule, pour chaque pays : le nombre de client avec une note "A", le nombre de client avec une note "B", le nombre de client avec une note "C"...

    De ce style :



    Le problème, c'est que je souhaite faire tout ca en une seule requête pour un formulaire. Pour l'instant, j'en suis là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT Continent.nom, Pays.nom, Count(*) as Client_A
    FROM (Continent INNER JOIN Pays ON Continent.nom = Pays.fk_continent) INNER JOIN Client ON Pays.nom = Client.fk_pays
    WHERE relation = 'A'
    GROUP BY Continent.nom, Pays.nom;
    Le problème est que je n'ai que le nombre de client avec une note de A, et je voudrais les colonnes pour B, C et D. J'ai lu pas mal de truc mais je ne trouve rien de concret ! Je suppose qu'il faut faire un deuxieme Count(*) ou une sous-requête (en supprimant le where).

    J'ai vu des cas avec des IF, CASE , WHEN , mais c'était sous d'autre SGBD.

    Une idée?

    Par avance merci je galère depuis ce matin !
    Images attachées Images attachées    

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 197
    Billets dans le blog
    47
    Par défaut
    bonjour,

    tu peux faire ça assez facilement avec les requêtes "Analyse croisée", du style:

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TRANSFORM nz(Count(client),0) AS NbrClients
    SELECT fk_pays
    FROM Client
    GROUP BY fk_pays
    PIVOT relation;

    PS: tu devrais renommer tes champs "nom" en nomClient, nomPays et nomContinent

  3. #3
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 49
    Par défaut
    Bonjour,

    Merci pour la réponse.En fait, je venais tout juste de trouver grâce à la fonction IIF (Test , Valeur Si Vrai, Valeur Si Faux) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Continent.nom, Pays.nom, SUM(IIF( [relation]='A', 1, 0 ) ) AS Client_A, SUM(IIF( [relation]='B', 1, 0 ) ) AS Client_B,  SUM(IIF( [relation]='C', 1, 0 ) ) AS Client_C,  SUM(IIF( [relation]='D', 1, 0 ) ) AS Client_D
    FROM (Continent INNER JOIN Pays ON Continent.nom = Pays.fk_continent) INNER JOIN Client ON Pays.nom = Client.fk_pays
    GROUP BY Continent.nom, Pays.nom;
    Mais ca me semblait très lourd.


    Mais je remarque que ta requête marche très bien, c'est très puissant, et c'est peut être mieux car si on ajoute la note E, je suppose que ta requête sera toujours d'actualité, alors que la mienne non (enfin ,je crois).
    Par contre, il y a moyen de renommer directement les colonnes avec cette requête ? (au lieu du nom des relation : A B C et D)


    PS : Oui pour les nom des colonnes je le ferais ...
    Merci !

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 197
    Billets dans le blog
    47
    Par défaut
    re,

    Par contre, il y a moyen de renommer directement les colonnes avec cette requête ? (au lieu du nom des relation : A B C et D)
    Avec une table supplémentaire TblRelation(Relation, LibelleRelation)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TblRelation:
    
    Relation   LibelleRelation
       A        Note A
       B        Note B
    etc...
    et un pivot sur LibelleRelation.


    Par contre, si tu n'as aucun client dans un pays, la ligne du pays n'apparaît pas.
    De même si aucun client n'a eu la note E (par exemple), la colonne E n'apparaît pas non plus.

    C'est gênant ?

  5. #5
    Membre averti
    Inscrit en
    Mars 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 49
    Par défaut
    Ah oui je n'avais pas songé à cette possibilité. Pour les lignes (clients) c'est pas trop grave, mais pour les colonnes (notes) c'est un peu plus embêtant car en fait cette requête sera la source d'un formulaire et je placerai des texte box avec comme source chaque "relation" A, B C ou D et je risque de ne pas avoir accès à ces contrôles du coup.

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 197
    Billets dans le blog
    47
    Par défaut
    en deux temps,

    une première requête de sélection R100 qui retourne toutes les combinaisons (pays,relation)


    et la deuxième requête "analyse croisée":


    tu noteras la jointure de type 2, R100===>Client


    cette requête sera la source d'un formulaire et je placerai des texte box avec comme source chaque "relation" A, B C ou D et je risque de ne pas avoir accès à ces contrôles du coup.
    Je ne suis pas sûr d'avoir saisi mais tu ne comptes pas te servir de cette requête comme source de formulaire pour de la saisie hein ? Cette requête est verrouillée en écriture.

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

Discussions similaires

  1. [AC-2007] Calcul d’1 champ dans une requête SQL selon différents critères
    Par rch05 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 28/04/2011, 16h44
  2. Formulaire pour plusieurs critères dans une requète
    Par toniodelavega dans le forum IHM
    Réponses: 4
    Dernier message: 06/08/2010, 11h19
  3. Envoyer plusieurs critères dans une requête ?
    Par olivierc25 dans le forum Access
    Réponses: 4
    Dernier message: 20/03/2007, 15h13
  4. Plusieurs jointures dans une requête sql
    Par Pero dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/09/2005, 20h59
  5. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38

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