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 MySQL Discussion :

COUNT(DISTINCT Valeur-A) et GROUP BY


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Amateur
    Inscrit en
    Septembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Septembre 2016
    Messages : 11
    Points : 6
    Points
    6
    Par défaut COUNT(DISTINCT Valeur-A) et GROUP BY
    Bonjour,

    j'ai une question concernant la commande COUNT(DISTINCT Valeur-A) est-elle incompatible avec un GROUP BY Valeur-B car sur le net je vois plein de requête qui utilise cette méthode.
    Lorsque je fais le test, j'ai le Total pour toutes les lignes.
    A priori, le COUNT DISTINCT se faisant dans le SELECT il ne tient pas compte du GROUP BY, c'est bien cela ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT
    Sai_Nom AS Saison,
    COUNT(DISTINCT mtch_id) AS TotalMatchSaison
    FROM MaTable
    ...
    ...
    ...
    WHERE Joueur_id = 167
    GROUP BY Saison

    Y-a-t-il une méthode pour effectuer cela ?

    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    le COUNT DISTINCT se faisant dans le SELECT il ne tient pas compte du GROUP BY, c'est bien cela ?
    Non non, il en tient bien compte.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Sai_Nom AS Saison, COUNT(DISTINCT mtch_id) AS TotalMatchSaison
    FROM MaTable
    ...
    WHERE Joueur_id = 167
    GROUP BY Saison
    Avec ceci tu auras le nombre de matches distincts par saison par le joueur ID 167, avec 1 ligne par saison.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Amateur
    Inscrit en
    Septembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Septembre 2016
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    d'accord merci pour la réponse qui ne m'arrange pas , car pour chaque saison, j'ai toujours le total cumulé de tous les matchs du joueur...

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Quel est le besoin fonctionnel ? Que cherchez-vous à obtenir ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Amateur
    Inscrit en
    Septembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Septembre 2016
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bonjour,
    initialement j'avais 2 requêtes, une pour compter le nombre de matchs effectués par saison et compétition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT count(compos.compo_num) AS TotalMatchSaison,
    saison.sai_nom AS NomSaison,
    c.comp_nom AS NomCompet
    FROM compos
    inner join mtchs on compos.mtch_id=mtchs.mtch_id
    inner join saison on mtchs.id_saison=saison.sai_id
    inner join joueurs on compos.joueur_id=joueurs.joueur_id
    INNER JOIN compet AS c ON mtchs.id_compet=c.id_comp
    WHERE joueurs.joueur_id = 167
    and compos.compo_num<24
    GROUP BY NomSaison, NomCompet

    et une pour compter les actions essais,pénalités toujours par saison et compétition:

    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
     
    select 
    saison.sai_nom AS NomSaison,
    c.comp_nom AS NomCompet,
    sum(case WHEN marqueurs.action_id=1 then 1 else 0 end) AS TotalEssais,
    sum(case WHEN marqueurs.action_id=2 then 1 else 0 end) AS TotalTransf,
    sum(case WHEN marqueurs.action_id=3 then 1 else 0 end) AS TotalPen,
    sum(case WHEN marqueurs.action_id=4 then 1 else 0 end) AS TotalDrop,
    sum(case WHEN marqueurs.action_id=5 then 1 else 0 end) AS TotalCJ,
    sum(case WHEN marqueurs.action_id=6 then 1 else 0 end) AS TotalCR
    from marqueurs
    inner join mtchs on mtchs.mtch_id=marqueurs.mtch_id
    inner join saison on saison.sai_id=mtchs.id_saison
    INNER JOIN compet AS c ON mtchs.id_compet=c.id_comp
    where marqueurs.joueur_id = 167
    GROUP BY NomSaison, NomCompet

    Je voulais essayer de combiner en une seule requête pour afficher les données dans un seul et même tableau.

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Voici une manière de combiner tes 2 requêtes grâce aux CTE (MySQL 8)
    (ta syntaxe est à harmoniser)

    WITH
    	match_count AS (
    		SELECT
    			count(compos.compo_num) AS TotalMatchSaison,
    			saison.sai_nom AS NomSaison,
    			c.comp_nom AS NomCompet
    		FROM compos
    		inner join mtchs on compos.mtch_id=mtchs.mtch_id
    		inner join saison on mtchs.id_saison=saison.sai_id
    		inner join joueurs on compos.joueur_id=joueurs.joueur_id
    		INNER JOIN compet AS c ON mtchs.id_compet=c.id_comp
    		WHERE joueurs.joueur_id = 167 and compos.compo_num<24
    		GROUP BY NomSaison, NomCompet
    	),
    	action_count AS (
    		select 
    			saison.sai_nom AS NomSaison,
    			c.comp_nom AS NomCompet,
    			sum(case WHEN marqueurs.action_id=1 then 1 else 0 end) AS TotalEssais,
    			sum(case WHEN marqueurs.action_id=2 then 1 else 0 end) AS TotalTransf,
    			sum(case WHEN marqueurs.action_id=3 then 1 else 0 end) AS TotalPen,
    			sum(case WHEN marqueurs.action_id=4 then 1 else 0 end) AS TotalDrop,
    			sum(case WHEN marqueurs.action_id=5 then 1 else 0 end) AS TotalCJ,
    			sum(case WHEN marqueurs.action_id=6 then 1 else 0 end) AS TotalCR
    		from marqueurs
    		inner join mtchs on mtchs.mtch_id=marqueurs.mtch_id
    		inner join saison on saison.sai_id=mtchs.id_saison
    		INNER JOIN compet AS c ON mtchs.id_compet=c.id_comp
    		where marqueurs.joueur_id = 167
    		GROUP BY NomSaison, NomCompet
    	),
    	axe AS (
    		SELECT ALL NomCompet, NomSaison FROM match_count
    		UNION DISTINCT
    		SELECT ALL NomCompet, NomSaison FROM action_count
    	)
    SELECT ALL a.NomCompet, a.NomSaison, mc.TotalMatchSaison, ac.TotalEssais, ac.TotalTransf, ...
    FROM axe AS a
    LEFT OUTER JOIN match_count AS mc ON (a.NomCompet, a.NomSaison) = (mc.NomCompet, mc.NomSaison)
    LEFT OUTER JOIN action_count AS ac ON (a.NomCompet, a.NomSaison) = (ac.NomCompet, ac.NomSaison)
    On peut probablement procéder sans CTE, mais sans schéma et jeu de données de test je ne m'y risquerai pas.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  7. #7
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    PS

    Pour un décompte, plutôt que de faire une somme de 0 et de 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum(case WHEN marqueurs.action_id=1 then 1 else 0 end) AS TotalEssais,
    Tu peux faire cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COUNT(CASE WHEN marqueurs.action_id = 1 THEN TRUE END) AS TotalEssais,
    => Tu comptes l'action seulement de type 1 (TRUE)
    => Le CASE des actions d'un autre type donnera NULL, elles ne seront donc pas décomptées
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Amateur
    Inscrit en
    Septembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Septembre 2016
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Superbe ! c'est exactement ce que je voulais !
    Merci il faut que j'analyse la requête et que j'essaie de comprendre car je ne connais pas du tout cette méthode.

    J'ai appliqué la modification de ton second message (COUNT(CASE WHEN marqueurs.action_id = 1 THEN TRUE END) mais pour certaines années les données renvoyées sont toujours NULL et non pas 0, à quoi est ce dû (voir PJ) ?
    Images attachées Images attachées  

  9. #9
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    J'ai appliqué la modification de ton second message (COUNT(CASE WHEN marqueurs.action_id = 1 THEN TRUE END) mais pour certaines années les données renvoyées sont toujours NULL et non pas 0
    Ce n'est pas le COUNT() qui provoque cela, mais le OUTER JOIN => Un joueur avec 0 ligne sur le couple (NomCompet/NomSaison) dans action_count n'a pas de TotalEssais & cie, d'où le marqueur NULL.

    Tu peux éviter cela en ajoutant des COALESCE() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ALL a.NomCompet, a.NomSaison, mc.TotalMatchSaison, COALESCE(ac.TotalEssais, 0) AS TotalEssais, ...
    ...
    EDIT : correction SQL/colonne
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Amateur
    Inscrit en
    Septembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Septembre 2016
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Ok merci, mais pour bien comprendre pourquoi il y a 0 partout pour la 3ème ligne en partant du haut et pas NULL comme les 2 lignes juste en dessous ?

  11. #11
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par aunisien Voir le message
    pour bien comprendre pourquoi il y a 0 partout pour la 3ème ligne en partant du haut et pas NULL comme les 2 lignes juste en dessous ?
    Parce qu'il doit déjà y avoir une ligne à 0 dans la 2nde requête (celle placée dans la CTE action_count).
    NULL apparaît lorsqu'il n'y a pas de ligne correspondante dans action_count (TotalEssais, TotalTransf, etc.) et/ou dans match_count (TotalMatchSaison)
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Amateur
    Inscrit en
    Septembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Septembre 2016
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Merci pour ton aide et tes réponses.

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

Discussions similaires

  1. [AC-2010] COUNT DISTINCT dans un SELECT Group By
    Par Groszours dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 19/07/2016, 17h00
  2. COUNT(DISTINCT champ) et GROUP BY
    Par redah75 dans le forum Requêtes
    Réponses: 5
    Dernier message: 29/11/2013, 13h39
  3. Count de valeur distinctes
    Par neperien dans le forum Débuter
    Réponses: 2
    Dernier message: 10/06/2013, 15h02
  4. [A-00] Count(Distinct) avec plusieurs Select et Group by...
    Par Thomak dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 30/10/2008, 11h11
  5. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 15h22

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