Выражение GROUP BY

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

Если указано условие GROUP BY, все кортежи, имеющие совпадающие данные в группирующих столбцах (т. е. все кортежи, принадлежащие одной группе), будут объединены. Значения самих группирующих столбцов не изменяются, а любые другие столбцы могут быть объединены с помощью агрегатной функции (например, count, sum, avg, и т. д.).

GROUP BY ALL

Используйте GROUP BY ALL для группировки всех столбцов в выражении SELECT, которые не обернуты в агрегатные функции. Это упрощает синтаксис, позволяя хранить список столбцов в одном месте, и предотвращает ошибки, сохраняя гранулярность SELECT в соответствии с гранулярностью GROUP BY (например, предотвращает дублирование).

Синтаксис

Могут использоваться следующие варианты синтаксиса:

SELECT ...
  FROM ...
  [ ... ]
  GROUP BY groupItem [ , groupItem [ , ... ] ]
  [ ... ]
SELECT ...
  FROM ...
  [ ... ]
  GROUP BY ALL
  [ ... ]

где:

groupItem ::= { <column_alias> | <position> | <expr> }

Параметры

  • <column_alias>
    Псевдоним столбца, заданный в выражении SELECT.


  • <position>
    Позиция выражения в выражении SELECT.


  • <expr>
    Любое выражение, заданное на таблицах в текущей области видимости.


  • GROUP BY ALL
    Указывает, что все элементы в выражении SELECT, которые не используют агрегатные функции, должны использоваться для группировки.

Примеры

  • Вычислим количество записей в таблице employees (работников), относящихся к каждому отделу:

    SELECT department, count(*)
    FROM employees
    GROUP BY department;
  • Вычислим среднюю зарплату для каждого отдела каждого подразделения:

    SELECT division, department, avg(salary)
    FROM employees
    GROUP BY division, department;
  • Сгруппируем данные по отделам и подразделениям, чтобы увидеть все уникальные пары "отдел — подразделение":

    SELECT division, department
    FROM employees
    GROUP BY ALL;