Как использовать T-SQL Group By
Я знаю, что мне нужно иметь (хотя и не знаю почему) предложение GROUP BY
в конце SQL-запроса, в котором используются любые агрегированные функции, такие как count
, sum
, avg
и т.д.:
SELECT count(userID), userName
FROM users
GROUP BY userName
Когда еще было бы полезно использовать GROUP BY
и каковы последствия для производительности?
Ответы
Ответ 1
Чтобы получить количество виджетов из каждой категории виджетов с более чем 5 виджетами, вы можете сделать это:
SELECT WidgetCategory, count(*)
FROM Widgets
GROUP BY WidgetCategory
HAVING count(*) > 5
Предложение "having" - это то, о чем люди часто забывают, вместо этого предпочитая извлекать все свои данные клиенту и итерации через него там.
Ответ 2
GROUP BY похож на DISTINCT, поскольку он группирует несколько записей в один.
В этом примере, взятом из http://www.devguru.com/technologies/t-sql/7080.asp, перечислены отдельные продукты в таблице Products.
SELECT Product FROM Products GROUP BY Product
Product
-------------
Desktop
Laptop
Mouse
Network Card
Hard Drive
Software
Book
Accessory
Преимущество GROUP BY over 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
Ответ 3
Подсчет количества использованных тегов может быть примером Google:
SELECT TagName, Count(*)
AS TimesUsed
FROM Tags
GROUP BY TagName ORDER TimesUsed
Если вам просто нужно отличное значение тегов, я бы предпочел использовать оператор DISTINCT
.
SELECT DISTINCT TagName
FROM Tags
ORDER BY TagName ASC
Ответ 4
Группа. Заставляет весь набор заполняться до того, как будут возвращены записи (поскольку это неявный вид).
По этой причине (и многие другие) никогда не используйте группу By в подзапросе.
Ответ 5
GROUP BY также помогает, когда вы хотите сгенерировать отчет, который будет усреднять или суммировать кучу данных. Вы можете GROUP по идентификатору отдела, а SUM - все доходы от продаж или AVG - количество продаж за каждый месяц.