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 sur plusieurs colonnes


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2010
    Messages : 146
    Points : 156
    Points
    156
    Par défaut Group by sur plusieurs colonnes
    bonjour,
    je veux comprendre comment fonctionne un group by sur plusieur colonne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select c1,c2, c3 from table .....
    ....
    ....
    group by (c1,c2,c3)

    merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    La clause GROUP BY sans calcul d'agrégat (SUM, COUNT...) n'a strictement aucun intérêt. C'est même une imbécilité que l'on rencontre souvent chez les développeurs.

    À me lire : http://sqlpro.developpez.com/cours/s...laz/ensembles/

    A +

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2010
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2010
    Messages : 146
    Points : 156
    Points
    156
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    La clause GROUP BY sans calcul d'agrégat (SUM, COUNT...) n'a strictement aucun intérêt.
    oui je sais mais je veux savoir comment le groupement se fait sur plusieurs colonnes

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 268
    Points : 41 671
    Points
    41 671
    Billets dans le blog
    64
    Par défaut
    Bonjour,

    pour ne pas se faire "assassiner" par SQLPro (toujours très agréable de se faire traiter d'imbécile ) il vous aurait suffit de changer un élément de votre code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select c1,c2, c3, sum(c4)  from table .....
    ....
    ....
    group by c1,c2,c3
    mais je veux savoir comment le groupement se fait sur plusieurs colonnes
    je présume (très mauvais de "présumer") que vous ne voulez pas savoir comment cela se passe en "cuisine interne" mais plutôt si l'ordre des colonnes du group by est respecté : c'est OUI, et le résultat sera également proposé en fonction de cet ordre

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    je présume (très mauvais de "présumer") que vous ne voulez pas savoir comment cela se passe en "cuisine interne" mais plutôt si l'ordre des colonnes du group by est respecté : c'est OUI, et le résultat sera également proposé en fonction de cet ordre
    Ça c'est faux.

    Si en effet, le GROUP BY produit la plupart du temps un résultat ordonné dans le même ordre que la liste des colonnes qui y figurent, ceci n'est qu'un simple effet de bord. En effet, pour regrouper des lignes, le plus simple, c'est de les trier avant !
    Cependant, en cas d'index, ou en cas de traitement multithreadé, l'ordre des lignes peut ne pas du tout être le même ! GROUP BY ne garanti en rien l'ordre des lignes (et je pense que le lien que donne SQL Pro le précise, avec, le connaissant, un exemple à l'appui !)

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 268
    Points : 41 671
    Points
    41 671
    Billets dans le blog
    64
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Si en effet, le GROUP BY produit la plupart du temps un résultat ordonné dans le même ordre que la liste des colonnes qui y figurent, ceci n'est qu'un simple
    effet de bord.
    Au temps pour moi qui avait voulu simplifier ma réponse, c'est effectivement l'effet de bord que j'ai sur les SGBDR que je pratique le plus !

    (et je pense que le lien que donne SQL Pro le précise, avec, le connaissant, un exemple à l'appui !)
    lien mort ou qui ne fonctionne pas lors de ma réponse

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Voici un exemple sous SQL Server.

    En toute logique, même MySQL doit faire le même résultat :
    Code sql : 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    create table testgroupby
    (
    	id int not null primary key identity,
    	col1 int,
    	col2 int,
    	col3 int,
    	col4 int
    );
    go
     
    create index idx_groupby on testgroupby(col3, col4);
    go
     
    insert into testgroupby (col1, col2, col3, col4) values
    (2, 2, 2, 2),
    (2, 1, 2, 1),
    (2, 3, 2, 3),
    (2, 1, 2, 1),
    (1, 1, 1, 1),
    (1, 2, 1, 2),
    (3, 2, 3, 2),
    (1, 3, 1, 3);
     
    -- Les lignes apparaissent dans l'ordre d'insertion en raison de la présence d'un index CLUSTERED sur la clé primaire auto-incrément et l'absence d'index sur les colonnes lues
    select col1, col2
    from testgroupby;
     
    -- Les lignes apparaissent dans l'ordre du GROUP BY car il n'y a aucun index sur les colonnes du GROUP BY
    select col1, col2
    from testgroupby
    group by col1, col2;
     
    -- Les lignes apparaissent dans l'ordre du GROUP BY car il n'y a aucun index sur les colonnes du GROUP BY
    select col1, col2
    from testgroupby
    group by col2, col1;
     
    -- Les lignes apparaissent triées dans l'ordre de l'index qui porte sur col3, col4, puisque c'est l'index qui est lu plutôt que la table
    select col3, col4
    from testgroupby;
     
    -- Les lignes apparaissent triées dans l'ordre de l'index qui porte sur col3, col4, puisque c'est l'index qui est lu plutôt que la table (par hasard, c'est le même ordre que GROUP BY)
    select col3, col4
    from testgroupby
    group by col3, col4;
     
    -- Les lignes apparaissent triées dans l'ordre de l'index qui porte sur col3, col4, puisque c'est l'index qui est lu plutôt que la table, et non dans l'ordre du GROUP BY
    select col3, col4
    from testgroupby
    group by col4, col3;

    En fait, le seul effet de bord systématique, c'est qu'il fait un DISTINCT, mais aucun intérêt de faire un GROUP BY pour faire un DISTINCT, car le GROUP BY est bien plus lourd (il ne fait qu'un DISTINCT)

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    je présume [...] que vous [...] voulez [..] savoir [...] si l'ordre des colonnes du group by est respecté : c'est OUI, et le résultat sera également proposé en fonction de cet ordre

    Ça c'est une imbécilité magistrale !


    Il n'existe jamais aucun ordre, ni dans le stockage, ni dans la restitution des données, dans les SGBDR. En particulier le GROUP BY n'a rien à voir avec un tri...

    En effet, il existe d'autres algorithmes pour générer l'opération de groupage, tel que le hachage qui ne respecte aucun ordre atomique des données.

    D'autre part dans les SGBDR capable de faire certains algorithmes en paralléle, afin accélérer l'exécution des requêtes, le résultant sera présenté généralement en fonction de l'ordre de terminaison des threads qui est arbitraire.

    Visiblement vous avez dû travailler avec des SGBD bas de gamme style Access, MySQmerde ou FireBird.... dont les moteurs relationnels sont pauvres et limités !

    A +

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 268
    Points : 41 671
    Points
    41 671
    Billets dans le blog
    64
    Par défaut
    Citation Envoyé par SQLpro Voir le message

    Ça c'est une imbécilité magistrale !

    Visiblement vous avez dû travailler avec des SGBD bas de gamme style Access, MySQmerde ou FireBird.... dont les moteurs relationnels sont pauvres et limités !
    Merci votre politesse me touche toujours beaucoup, sissi j'insiste

    je porte quand même à l'attention qu'ainsi est répondu à la question

    Et, oui, je travaille surtout avec Firebird question de budget, non j'ai travaillé avec d'autres SGBD mais cela fait un bail, oui j'avais simplifié

  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 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Ça c'est faux.

    Si en effet, le GROUP BY produit la plupart du temps un résultat ordonné dans le même ordre que la liste des colonnes qui y figurent, ceci n'est qu'un simple effet de bord. En effet, pour regrouper des lignes, le plus simple, c'est de les trier avant !
    Quand tu dis "la plupart du temps", je ne peut pas être d'accord avec toi... En effet, si le SGDBR dispose des différentes algorithmes de groupage et qu'il n'existe pas d'index pour ce faire et que l'ensemble à grouper n'est pas simple et léger (par exemple une seule colonne de type numérique) alors l'algorithme de hachage est gagnant dans tous les cas... Il est donc beaucoup plus courant d'utilisation que le tri...

    Cependant, en cas d'index, ou en cas de traitement multithreadé, l'ordre des lignes peut ne pas du tout être le même ! GROUP BY ne garanti en rien l'ordre des lignes (et je pense que le lien que donne SQL Pro le précise, avec, le connaissant, un exemple à l'appui !)
    A +

Discussions similaires

  1. GROUP BY sur plusieurs colonnes
    Par jeanvie dans le forum Langage SQL
    Réponses: 9
    Dernier message: 07/12/2017, 15h27
  2. Réponses: 8
    Dernier message: 09/01/2012, 10h45
  3. Jointure avec conditions sur plusieurs colonnes
    Par ben53 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 28/11/2005, 10h27
  4. Lister sur plusieurs colonnes dans état
    Par armagued dans le forum Access
    Réponses: 3
    Dernier message: 30/10/2005, 22h21
  5. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 16h22

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