Предложение GROUP BY
1.9. Предложение GROUP BY
Часто в запросах требуется формировать промежуточные итоги, что обычно отображается появлением в запросе фразы «для каждого...». Для этой цели в операторе SELECT используется предложение GROUP BY. Запрос, в котором присутствует GROUP BY, называется группирующим запросом, поскольку в нем группируются данные, полученные в результате выполнения операции SELECT, после чего для каждой отдельной группы создается единственная суммарная строка. Стандарт SQL требует, чтобы предложение SELECT и фраза GROUP BY были тесно связаны между собой. При наличии в операторе SELECT фразы GROUP BY каждый элемент списка в предложении SELECT должен иметь единственное значение для всей группы. Более того, предложение SELECT может включать только следующие типы элементов: имена полей, итоговые функции, константы и выражения, включающие комбинации перечисленных выше элементов.
Все имена полей, приведенные в списке предложения SELECT, должны присутствовать и во фразе GROUP BY – за исключением случаев, когда имя столбца используется в итоговой функции. Обратное правило не является справедливым – во фразе GROUP BY могут быть имена столбцов, отсутствующие в списке предложения SELECT.
Если совместно с GROUP BY используется предложение WHERE, то оно обрабатывается первым, а группированию подвергаются только те строки, которые удовлетворяют условию поиска.
Стандартом SQL определено, что при проведении группирования все отсутствующие значения рассматриваются как равные. Если две строки таблицы в одном и том же группируемом столбце содержат значение NULL и идентичные значения во всех остальных непустых группируемых столбцах, они помещаются в одну и ту же группу.
Пример 43. Вычислить средний объем покупок, совершенных каждым покупателем.
SELECT Klient.Familiya, Аvg(Sdelka. Kolichestvo)
AS Srednee Kolichestvo
FROM Klient INNER JOIN Sdelka
Рекомендуемые материалы
ON Klient.KodKlienta= Sdelka.KodKlienta
GROUP BY Klient.Familiya
Пример 44. Определить, на какую сумму был продан товар каждого наименования.
SELECT Tovar.Nazvanie,
Sum(Tovar.Cena*Sdelka. Kolichestvo)
AS Stoimosti
FROM Tovar INNER JOIN Sdelka
ON Tovar.KodTovara=Sdelka.KodTovara
GROUP BY Tovar.Nazvanie
Пример 45. Подсчитать количество сделок, осуществленных каждой фирмой.
SELECT Klient.Firma, Count;(Sdlka.KodSdelki)
AS Kolichestvo Sdelok
FROM Klient INNER JOIN Sdelka
ON Klient.KodKlienta= Sdelka.KodKlienta
GROUP BY Klient.Firma
Пример 46. Подсчитать общее количество купленного для каждой фирмы товара и его стоимость.
SELECT Klient.Firma, Sum(Sdelka. Kolichestvo)
AS Obshee Kolichestvo,
Sum(Tovar Cena*Sdelka. Kolichestvo)
AS Stoimosti FROM Tovar INNER JOIN
(Klient INNER JOIN Sdelka
ON Klient.KodKlientа=Sdelka.KodKlientа)
ON Tovar.KodTovarа=Sdelka.KodTovarа GROUP BY Klient.Firma
Пример 47.Сколько студентов на каждом курсе
SELECT Count (*) FROM Student
GROUP BY Kurs;
Пример 48.Сколько студентов проживают в Москве
SELECT Count (*) FROM Student
WHERE City = "Москва"
GROUP BY City;
Пример 49. Определить суммарную стоимость каждого товара за каждый месяц.
SELECT Tovar.Nazvanie, Month(Sdelka.Data)
AS Mesyac,
Sum(Tovar.Cena*Sdelka.Kolichestvo)
AS Stoimosti FROM Tovar INNER JOIN Sdelka
ON Tovar.KodTovarа=Sdelka.KodTovarа
GROUP BY Tovar.Nazvanie, Month(Sdelka.Data)
Пример 50. Определить суммарную стоимость каждого товара первого сорта за каждый месяц.
SELECT Tovar.Nazvanie, Month(Sdelka.Data)
Рекомендация для Вас - Вопрос 28.
AS Mesyac, Sum(Tovar.Cena*Sdelka. Kolichestvo)
AS Stoimosti
FROM Tovar INNER JOIN Sdelka
ON Tovar.KodTovarа=Sdelka.KodTovarа
WHERE Tovar.Sort="Первый"
GROUP BY Tovar.Nazvanie, Month(Sdelka.Data)