Utiliser group by sur plusieurs colonnes

1037

Je comprends l'intérêt de GROUP BY x

Mais comment ça GROUP BY x, ymarche, et qu'est-ce que ça veut dire?

l --''''''---------------- '' '' '' '' '' '' '
la source
2
Vous ne le trouverez pas décrit comme cette question le pose. La clause GROUP BY peut prendre un ou plusieurs champs. GROUPE PAR client; GROUPE PAR nom, prénom; GROUPE PAR année, magasin, référence, etc.
Bill

Réponses:

2029

Group By Xsignifie mettre tous ceux qui ont la même valeur pour X dans le même groupe .

Group By X, Ysignifie mettre tous ceux qui ont les mêmes valeurs pour X et Y dans le même groupe .

Pour illustrer à l'aide d'un exemple, disons que nous avons le tableau suivant, qui concerne qui suit quelle matière à l'université:

Table: Subject_Selection

Subject   Semester   Attendee
---------------------------------
ITB001    1          John
ITB001    1          Bob
ITB001    1          Mickey
ITB001    2          Jenny
ITB001    2          James
MKB114    1          John
MKB114    1          Erica

Lorsque vous utilisez group byuniquement une colonne sur le sujet; dire:

select Subject, Count(*)
from Subject_Selection
group by Subject

Vous obtiendrez quelque chose comme:

Subject    Count
------------------------------
ITB001     5
MKB114     2

... car il y a 5 entrées pour ITB001 et 2 pour MKB114

Si nous étions à group bydeux colonnes:

select Subject, Semester, Count(*)
from Subject_Selection
group by Subject, Semester

nous obtiendrions ceci:

Subject    Semester   Count
------------------------------
ITB001     1          3
ITB001     2          2
MKB114     1          2

En effet, lorsque nous regroupons par deux colonnes, il est dit "Groupez-les de sorte que tous ceux qui ont le même sujet et le même semestre soient dans le même groupe, puis calculez toutes les fonctions d'agrégation (Count, Sum, Average, etc. ) pour chacun de ces groupes " . Dans cet exemple, cela est démontré par le fait que, lorsque nous les comptons, il y a trois personnes faisant ITB001 au semestre 1 et deux le faisant au semestre 2. Les deux personnes faisant MKB114 sont au semestre 1, donc il n'y a pas de ligne pour le semestre 2 (aucune donnée ne rentre dans le groupe "MKB114, semestre 2")

J'espère que cela a du sens.

Smashery
la source
11
@Smashery: Cela signifie-t-il également que GROUP BY A,Bc'est la même chose que GROUP BY B,A?
tumchaaditya
23
Oui. Je ne peux pas dire avec certitude s'ils sont aussi efficaces les uns que les autres, mais ils donneront le même résultat, oui.
Smashery
2
Il convient d'ajouter ici qu'il existe une différence entre GROUP BY a, bet GROUP BY a AND bpuisque le second ne répertorie que les éléments groupés ayant exactement le même contenu et aucun "sous-groupe". Dans ce cas, la sortie serait la même que la première.
Dwza
5
Je voudrais ajouter que l'ordre dans lequel vous vous regroupez par les colonnes n'a pas d'importance. Dans l'exemple de groupe ci-dessus par semestre, le sujet aurait donné le même résultat
user2441441
2
eh bien, grouper par a, b et grouper par b, a ne retourne PAS le même résultat - les lignes sont affichées dans un ordre différent
fanny
33

La GROUP BYclause est utilisée conjointement avec les fonctions d'agrégation pour regrouper l'ensemble de résultats par une ou plusieurs colonnes. par exemple:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

Rappelez-vous cette commande:

1) SELECT (est utilisé pour sélectionner des données dans une base de données)

2) FROM (la clause est utilisée pour lister les tables)

3) WHERE (la clause est utilisée pour filtrer les enregistrements)

4) GROUP BY (la clause peut être utilisée dans une instruction SELECT pour collecter des données sur plusieurs enregistrements et regrouper les résultats par une ou plusieurs colonnes)

5) HAVING (la clause est utilisée en combinaison avec la clause GROUP BY pour restreindre les groupes de lignes renvoyées uniquement à ceux dont la condition est VRAIE)

6) ORDER BY (le mot-clé est utilisé pour trier l'ensemble de résultats)

Vous pouvez utiliser tous ces éléments si vous utilisez des fonctions d'agrégation, et c'est l'ordre dans lequel elles doivent être définies, sinon vous pouvez obtenir une erreur.

Les fonctions d'agrégation sont les suivantes:

MIN renvoie la plus petite valeur dans une colonne donnée

SUM renvoie la somme des valeurs numériques dans une colonne donnée

AVG renvoie la valeur moyenne d'une colonne donnée

COUNT renvoie le nombre total de valeurs dans une colonne donnée

COUNT (*) renvoie le nombre de lignes d'une table

S. Mayol
la source
1
mais où mettons-nous les 2 colonnes, comment agréger sur la base de 2 colonnes / plus est la question
Chaitanya Bapat
Salut Chaitanya, je ne sais pas si c'est ce que vous demandez mais laissez-moi vous donner quelques exemples. Si vous avez une table de produits, vous utilisez les fonctions d'agrégation de cette façon, voici deux scénarios: SELECT AVG (instock) FROM products; Cela calculera les unités moyennes en stock du tableau des produits. Maintenant, vous voulez calculer les unités en stock par catégorie de produit, vous devez utiliser la fonction AVG avec la clause GROUP BY comme ceci: SELECT categoryId, AVG (instock) FROM produits GROUP BY categoryId;
S. Mayol
Cela ne répond même pas à distance à la question ... La question ici est de savoir comment obtenir un "groupement enchaîné" de "sujet" et de "semestre" en même temps, comme expliqué dans l'exemple donné ...
MahNas92