Как мне использовать T-SQL Group By - PullRequest
30 голосов
/ 05 августа 2008

Я знаю, что мне нужно (хотя я не знаю почему) предложение GROUP BY в конце SQL-запроса, в котором используются какие-либо агрегатные функции, такие как count, sum, avg и т. Д .:

SELECT count(userID), userName
FROM users
GROUP BY userName

В противном случае GROUP BY будет полезным, и каковы последствия для производительности?

Ответы [ 5 ]

34 голосов
/ 05 августа 2008

Чтобы получить количество виджетов из каждой категории виджетов, содержащей более 5 виджетов, вы можете сделать это:

SELECT WidgetCategory, count(*)
FROM Widgets
GROUP BY WidgetCategory
HAVING count(*) > 5

Условие «иметь» - это то, о чем люди часто забывают, вместо этого они выбирают для получения всех своих данных клиенту и повторяют их там.

14 голосов
/ 19 августа 2008

GROUP BY похож на DISTINCT в том, что он группирует несколько записей в одну.

В этом примере, заимствованном из http://www.devguru.com/technologies/t-sql/7080.asp,, перечислены отдельные продукты в таблице "Продукты".

SELECT Product FROM Products GROUP BY Product

Product
-------------
Desktop
Laptop
Mouse
Network Card
Hard Drive
Software
Book
Accessory

Преимущество GROUP BY перед DISTINCT состоит в том, что он может предоставить вам детальный контроль при использовании с предложением 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
4 голосов
/ 05 августа 2008

Group By принудительно заполняет весь набор перед возвратом записей (поскольку это неявная сортировка).

По этой причине (и многим другим) никогда не используйте Group By в подзапросе.

2 голосов
/ 05 августа 2008

Подсчет количества использованных тегов может быть примером Google:

SELECT TagName, Count(*)
AS TimesUsed
FROM Tags
GROUP BY TagName ORDER TimesUsed

Если вам просто нужно отличное значение тегов, я бы предпочел использовать оператор DISTINCT.

SELECT DISTINCT TagName
FROM Tags
ORDER BY TagName ASC
0 голосов
/ 05 августа 2008

GROUP BY также помогает, когда вы хотите создать отчет, который будет усреднять или суммировать кучу данных. Вы можете Сгруппировать по ID отдела и СУММЕ всю выручку от продаж или AVG подсчитать объем продаж за каждый месяц.

...