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 :

GROUP BY : doublons et deux champs distincts


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut GROUP BY : doublons et deux champs distincts
    Bonjour à toutes et à tous,

    Apprenant le SQL depuis peu, je me casse légèrement la tête sur un problème qui semble assez simple mais malheureusement je ne vois pas comment je pourrai le résoudre.

    Considérons la table tIncidents suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ID	nmachine	ninter
    1	12		23
    2	1		4
    3	12		2
    4	12		2
    5	1		10
    6	1		69
    Mon but est d'effectuer une requête permettant de connaître quels sont les machines qui ont le plus d'interventions.

    J'ai donc fais la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nmachine, COUNT(nmachine) AS NbPanne FROM tIncidents GROUP BY nmachine ORDER BY NbPanne DESC;
    Mais le prob c'est que ça me retourne:Tout est normal bien sûr, mais j'aimerai que le le count ne prenne pas en compte les doublons au niveau "nmachine ninter" (ex: ID 3 et ID 4), et que le résultat soit plutôt le suivant:Je sais pas si c'est possible, et là je suis bloqué, je vous remercie par avance pour votre aide.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Il suffit que tu ailles jusqu'au bout de ton "expression de besoin"
    j'aimerai que le le count ne prenne pas en compte les doublons au niveau "nmachine ninter"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT nmachine, COUNT(DISTINCT ninter) AS NbPanne
    FROM tIncidents 
    GROUP BY nmachine 
    ORDER BY NbPanne DESC
    ;
    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
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup, cela fonctionne très bien

    Cependant j'ai du mal à comprendre la solution, je m'explique.

    Imaginons que je rajoute l'enregistrement ID 7:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ID	nmachine	ninter
    1	12		23
    2	1		4
    3	12		2
    4	12		2
    5	1		10
    6	1		69
    7	1		23
    Le résultat de votre requête corrigé affiche dans ce casCela réponds tout à fait à ma problématique, mais je me demande pourquoi COUNT DISTINCT ninter n'agit pas ici en omettant l'ID 7 où ninter = 23 tout comme l'ID 1 où ninter = 23. Je pense que ça vient du group by, mais j'arrive pas trop à comprendre, si vous avez une petite explication sur le sujet je serai ravi de l'entendre.

    Merci beaucoup en tout cas

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 803
    Points
    30 803
    Par défaut
    La requête regroupe par nmachine et, pour chaque nmachine, compte le nombre de valeurs distinctes de ninter.
    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.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Ah d'accord.

    En gros GROUP BY est prioritaire sur l’agrégation, donc regroupement par machine et agrégation ensuite avec COUNT. C'est plus clair, merci

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par glorieuxduc Voir le message
    Ah d'accord.

    En gros GROUP BY est prioritaire sur l’agrégation, donc regroupement par machine et agrégation ensuite avec COUNT. C'est plus clair, merci
    Non : le GROUP BY c'est l'agrégation, alors que COUNT compte le nombre d'occurrences pour les éléments qui peuvent ou non être agrégés.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Non : le GROUP BY c'est l'agrégation, alors que COUNT compte le nombre d'occurrences pour les éléments qui peuvent ou non être agrégés.
    Non pas du tout, l'agrégation c'est les fonctions permettant de faire des statistiques sur une colonne définie (de transformer son contenu via une fonction). ex: MIN, MAX, AVG, COUNT, etc...

    EX:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUM(depense_client) AS TotalEncaisse FROM tEncaissement ;
    Affichera tous le total des encaissements grâce à la fonction d'agrégation SUM(depense_client);

    Le GROUP BY, permet de regrouper les données d'une (ou plusieurs) colonne afin qu'il n'y ai pas de doublon (ex: regroupement par ville, nom client), du coup les doublons ne sont pas affichés mais ils sont transmis aux fonctions d'agrégations si il y en a. Du coup avec GROUP BY au lieu qu'une fonction d'agrégation soit appelée 1 seule fois, celle-ci sera appelée N fois (N enregistrement affichés).


    Imaginons que nous avons 3 client: Martin, Doe et Jackson.

    EX:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT nom_client, SUM(depense_client) AS TotalEncaisseClient FROM tEncaissement GROUP BY nom_client ;
    aura le même effet que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SUM(depense_client) AS TotalEncaisseMartin FROM tEncaissement WHERE nom_client = Martin;
    SELECT SUM(depense_client) AS TotalEncaisseDoeFROM tEncaissement WHERE nom_client = Doe;
    SELECT SUM(depense_client) AS TotalEncaisseJackson FROM tEncaissement WHERE nom_client = Jackson;
    GROUP BY n'est pas de l'agrégation, ça permet juste d'utiliser l'agrégation de manière plus efficace.

    On peut très bien utiliser GROUP BY sans agrégation, par exemple pour afficher les différents noms de villes dans une table, en évitant les doublons.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ville from tClient GROUP BY ville;

  8. #8
    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,

    Citation Envoyé par glorieuxduc Voir le message
    On peut très bien utiliser GROUP BY sans agrégation, par exemple pour afficher les différents noms de villes dans une table, en évitant les doublons.

    Pour cela, il convient d'utiliser DISTINCT

  9. #9
    Membre éclairé Avatar de bstevy
    Homme Profil pro
    Solutions Architect
    Inscrit en
    Mai 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Japon

    Informations professionnelles :
    Activité : Solutions Architect
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 552
    Points : 870
    Points
    870
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Pour cela, il convient d'utiliser DISTINCT
    Moi, je le fais avec un qualify lol ^^

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 565
    Points
    52 565
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par glorieuxduc Voir le message
    On peut très bien utiliser GROUP BY sans agrégation, par exemple pour afficher les différents noms de villes dans une table, en évitant les doublons.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ville from tClient GROUP BY ville;
    Non, absolument pas ceci est d'une haute stupidité.... En effet GROUP BY n'a pas vocation de remplacer DISTINCT et ce n'est même pas la même opération !

    Démonstration (je l'ai déjà donnée une fois dans ce forum, mais visiblement vous ne lisez pas ce qui a déjà été posté et affirmez d'énormes bêtises !

    DÉMONSTRATION :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE T (K INT, V VARCHAR(16), D DATE);
     
    INSERT INTO T VALUES
    (1, 'banane', '2005-01-01'),
    (1, 'banane', '2005-01-01'),
    (1, 'banane', '2005-01-01'),
    (2, 'banane', '2005-01-01'),
    (3, 'poire',  '2005-01-01');
    Requête GROUP BY sans DISTINCT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT D
    FROM   T
    GROUP  BY K, D
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    D
    ----------
    2005-01-01
    2005-01-01
    2005-01-01
    Avec DISTINCT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT DISTINCT D
    FROM   T
    GROUP  BY K, D
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    D
    ----------
    2005-01-01
    CQFD !

    Bref, apprenez la langage SQL. Mon site web comme mon livre peuvent vous y aider !

    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/ * * * * *

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    sans vouloir te vexer SQLPro, j'aimerais te faire remarquer que tu montes trop vite sur tes grands chevaux !

    ta démonstration pèche car tu utilise deux champs pour le group by au lieu d'un seul comme l'indiquait glorieuxduc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT D FROM T GROUP BY D
    ne fourni bien qu'une seule réponse

    donc pas de CQFD

    pour ce que j'en sais sur DISTINCT versus GROUP BY :
    pour certains SGBD le parser semble se charger de faire une conversion si besoin
    le GROUP BY effectue également un tri à contrario de DISTINCT cependant si le champ est un Index on obtient le même résultat
    s'il n'y a pas de fonction d'agrégat mieux vaut utiliser le DISTINCT que le GROUP BY

    as-tu plus de précisions sur le combat DISTINCT vs GROUP BY ?

    ceci étant, sur ce genre d'exemple c'est un peu
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 565
    Points
    52 565
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    le GROUP BY effectue également un tri...
    Ce que vous dites est faux, il existe d'autre moyens de faire un GROUP BY que le tri qui est généralement l'algorithme le plus couteux. En particulier le groupement par hachage...

    En tout état de cause GROUP BY et DISTINCT n'a rien à voir.

    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/ * * * * *

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Ce que vous dites est faux, il existe d'autre moyens de faire un GROUP BY que le tri qui est généralement l'algorithme le plus couteux. En particulier le groupement par hachage...
    Encore une fois, haro sur vos grand chevaux! je n'ai jamais dit que c'était un moyen de faire un tri c'est une constatation
    si justement GROUP BY est plus couteux que DISTINCT c'est justement à cause de ce tri.
    si peu de différence de temps et de ressources sont constatées entre GROUP BY et DISTINCT et que l'ordre obtenu est identique c'est si les champs sont indexés/font partie d'un index.
    Quant au Hachage, qui est tout autre chose que le SQL de départ SELECT D FROM T GROUP BY D j'ose encore le souligner, tous les SGBD n'en sont pas encore là

    En tout état de cause GROUP BY et DISTINCT n'a rien à voir.
    J'en suis conscient l'objectif de mon intervention était de te faire mettre de l'eau dans ton vin (même s'il s'agit d'une haute trahison pour un vigneron)
    et te faire remarquer qu'une remarque comme
    Citation Envoyé par SQLPro
    Non, absolument pas ceci est d'une haute stupidité.
    est loin d'être diplomate même si sa vertu se veut d'être pédagogique
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 565
    Points
    52 565
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    ...et te faire remarquer qu'une remarque comme ...
    est loin d'être diplomate même si sa vertu se veut d'être pédagogique
    Mon souhait est de ne surtout jamais verser ni dans le diplomate et encore moins dans le politiquement correct !
    On voit ou cela nous même, par exemple avec le hollandisme !

    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/ * * * * *

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

Discussions similaires

  1. Doublons sur deux champs
    Par Steph0 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/01/2011, 23h03
  2. comment chercher les doublons sur deux champs (ou plus)
    Par alili mostafa dans le forum Bases de données
    Réponses: 4
    Dernier message: 31/05/2010, 19h09
  3. Réponses: 2
    Dernier message: 02/06/2007, 08h57
  4. [Oracle] Recherche de doublons sur deux champs
    Par BiM dans le forum Langage SQL
    Réponses: 28
    Dernier message: 04/01/2007, 12h52
  5. [Access] supprimer les doublons sur deux champs
    Par nini94 dans le forum Langage SQL
    Réponses: 15
    Dernier message: 13/10/2006, 11h41

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