1. #1
    Membre régulier
    Inscrit en
    août 2010
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : août 2010
    Messages : 87
    Points : 109
    Points
    109

    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 SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    17 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 17 257
    Points : 39 959
    Points
    39 959
    Billets dans le blog
    1

    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 +
    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...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  3. #3
    Membre régulier
    Inscrit en
    août 2010
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : août 2010
    Messages : 87
    Points : 109
    Points
    109

    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
    Inscrit en
    janvier 2007
    Messages
    8 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 8 374
    Points : 19 394
    Points
    19 394
    Billets dans le blog
    4

    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
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  5. #5
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    3 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 : 3 033
    Points : 4 981
    Points
    4 981
    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 !)
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    8 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 8 374
    Points : 19 394
    Points
    19 394
    Billets dans le blog
    4

    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
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  7. #7
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    février 2010
    Messages
    3 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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 : 3 033
    Points : 4 981
    Points
    4 981
    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)
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    17 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 17 257
    Points : 39 959
    Points
    39 959
    Billets dans le blog
    1

    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 +
    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...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    8 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 8 374
    Points : 19 394
    Points
    19 394
    Billets dans le blog
    4

    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é
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    17 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 17 257
    Points : 39 959
    Points
    39 959
    Billets dans le blog
    1

    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 +
    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...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

Discussions similaires

  1. GROUP BY sur plusieurs colonnes
    Par jeanvie dans le forum Langage SQL
    Réponses: 6
    Dernier message: 10/03/2017, 16h51
  2. Réponses: 8
    Dernier message: 09/01/2012, 09h45
  3. Jointure avec conditions sur plusieurs colonnes
    Par ben53 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 28/11/2005, 09h27
  4. Lister sur plusieurs colonnes dans état
    Par armagued dans le forum Access
    Réponses: 3
    Dernier message: 30/10/2005, 21h21
  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