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
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
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 +
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,c3je 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 ordremais je veux savoir comment le groupement se fait sur plusieurs colonnes
Ç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 !)
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 !
lien mort ou qui ne fonctionne pas lors de ma réponse(et je pense que le lien que donne SQL Pro le précise, avec, le connaissant, un exemple à l'appui !)
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)
Ç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 +
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é
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...A +
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 !)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager