Comment utiliser T-SQL Group By
-
08-06-2019 - |
Question
Je sais que j'ai besoin d'avoir (même si je ne sais pas pourquoi) un GROUP BY
clause à la fin d'une requête SQL qui utilise des fonctions d'agrégation telles que count
, sum
, avg
, etc:
SELECT count(userID), userName
FROM users
GROUP BY userName
Quand d'autre le ferait GROUP BY
être utile, et quelles sont les conséquences en termes de performances ?
La solution
Pour récupérer le nombre de widgets de chaque catégorie de widgets comportant plus de 5 widgets, vous pouvez procéder comme suit :
SELECT WidgetCategory, count(*)
FROM Widgets
GROUP BY WidgetCategory
HAVING count(*) > 5
La clause « avoir » est quelque chose que les gens oublient souvent, choisissant plutôt de récupérer toutes leurs données vers le client et de les parcourir là-bas.
Autres conseils
GROUP BY est similaire à DISTINCT dans le sens où il regroupe plusieurs enregistrements en un seul.
Cet exemple, emprunté à http://www.devguru.com/technologies/t-sql/7080.asp, répertorie les produits distincts dans le tableau Produits.
SELECT Product FROM Products GROUP BY Product
Product
-------------
Desktop
Laptop
Mouse
Network Card
Hard Drive
Software
Book
Accessory
L'avantage de GROUP BY par rapport à DISTINCT est qu'il peut vous donner un contrôle granulaire lorsqu'il est utilisé avec une clause HAVING.
SELECT Product, count(Product) as ProdCnt
FROM Products
GROUP BY Product
HAVING count(Product) > 2
Product ProdCnt
--------------------
Desktop 10
Laptop 5
Mouse 3
Network Card 9
Software 6
Group By force le remplissage de l'ensemble complet avant que les enregistrements ne soient renvoyés (puisqu'il s'agit d'un tri implicite).
Pour cette raison (et bien d’autres), n’utilisez jamais de Group By dans une sous-requête.
Compter le nombre de fois où les balises sont utilisées pourrait être un exemple de Google :
SELECT TagName, Count(*)
AS TimesUsed
FROM Tags
GROUP BY TagName ORDER TimesUsed
Si vous souhaitez simplement une valeur distincte de balises, je préférerais utiliser le DISTINCT
déclaration.
SELECT DISTINCT TagName
FROM Tags
ORDER BY TagName ASC
GROUP BY est également utile lorsque vous souhaitez générer un rapport qui fera la moyenne ou la somme d'un ensemble de données.Vous pouvez GROUPER Par l'ID de département et la SOMME tous les revenus des ventes ou AVG le nombre de ventes pour chaque mois.