Для группировки данных в запросе select используется конструкция group by, в которой должны быть перечислены те же столбцы, что и после select. Ниже приведен пример вывода данных по группам для таблицы bills.
-- таблица счетовcreate table bills(id integer,d date, -- дата счетаsumm double precision ,-- сумма счетаconstraint pk_bills primary key (id)); -- вставка данныхinsert into bills values(1, date '2008-01-01', 5.5);insert into bills values(2, date '2008-02-01', 3.14);insert into bills values(3, date '2008-03-01', 10.14);insert into bills values(4, date '2008-01-01', 7.2);insert into bills values(5, date '2008-02-01', 6.4);insert into bills values(6, date '2008-03-01', 2.5);commit; -- вывод данных по группамselect t.d, t.summ from bills t group by t.d, t.summ
Сами по себе группы редко используются, и предыдущий пример выборки можно заменить сортировкой. Другое дело, если необходимо воспользоваться одной из групповых функций, называемых агрегатными:
· avg([DISTINCT|ALL] column) - среднее значение по указанному столбцу;
· count(*|[DISTINCT|ALL] соlumn) - количество элементов в выборке или в группе определяемой указанным столбцом;
Ключевое слово DISTINCT позволяет игнорировать повторные значения в столбце, ALL обрабатывает все значения в столбце (по умолчанию), * позволяет включить в обработку поля с null значением. В MySQL между именем функции и скобкой не должно быть пробелов. Ниже приведен пример использования агрегатных функций в качестве выбираемых данных. Если агрегатная функция используется в выборке без group by, то она применяется ко всем записям выборки, иначе для каждой группы в отдельности. И в любом случае в перечислении select нельзя смешивать групповые столбцы с не групповыми.
-- статистические данные по всем месяцамselect count(*) as "число записей", max(t.summ) as "макс. сумма", min(t.summ) as "мин. сумма", avg(t.summ) as "средняя сумма", sum(t.summ) as "общая сумма" from bills t; -- статистические данные по каждому месяцуselect t.d as "месяц", count(1) as "число записей", max(t.summ) as "макс. сумма", min(t.summ) as "мин. сумма", avg(t.summ) as "средняя сумма", sum(t.summ) as "общая сумма" from bills t group by t.d
Агрегатные функции можно использовать в выражениях условия в конструкции having для отбора группы.
-- отбираем группы у которых общая сумма больше 12select t.d as "месяц", count(*) as "число записей", max(t.summ) as "макс. сумма", min(t.summ) as "мин. сумма", avg(t.summ) as "средняя сумма", sum(t.summ) as "общая сумма" from bills t group by t.dhaving sum(t.summ)>12