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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Amateur
    Inscrit en
    Septembre 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Septembre 2016
    Messages : 11
    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 confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 340
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 340
    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.

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

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Septembre 2016
    Messages : 11
    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 617
    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 617
    Billets dans le blog
    10
    Par défaut
    Quel est le besoin fonctionnel ? Que cherchez-vous à obtenir ?

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

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Septembre 2016
    Messages : 11
    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 confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 340
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 340
    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.

+ 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