Назад    Оглавление    Далее

Группировка строк в запросе

По умолчанию все строки таблицы рассматриваются как одна группа. Для разбиения таблицы на меньшие группы строк используется предложение GROUP BY команды SELECT.

Синтаксис:

SELECT {столбец, групповая_функция}

FROM Таблица

[WHERE условие]

[GROUP BY выражение_группирования]

[ORDER BY {Столбец, выражение} [ASC|DESC]];

где

выражение_группирования

Определяет столбец, по значениям которого группируются строки

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

Предложение WHERE позволяет исключить некоторые строки до начала разбиения на группы.

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

По умолчанию строки сортируются в порядке возрастания в соответствии со списком GROUP BY. Изменить порядок сортировки можно с помощью предложения ORDER BY.

Пример: Вывод номера фамилии, номера отдела сотрудников из отдела 41

ID LAST_NAME DEPATMENT
--------- ------------------ ---------------
2 Ngao 41
6 Urguhart 41
16 Maduro 41
17 Smith 41

Пример: Вывод номера отдела и количества сотрудников из отдела 41

DEPT_ID
--------------------
NUMBER
-------------------------
41 4
1 row selected  

Пример: Вывод всех возможных кредитных рейтингов и количества клиентов в каждой категории. Столбец должен иметь заголовок “# Cust”.

CREDIT_RATING
---------------------------------
# CUST
---------------------
EXELLENT 9
GOOD 3
POOR 3
...  

Пример: Вывод всех должностей, кроме вице-президента, и соответствующей общей заработной платы за месяц. Список сортируется по общей заработной плате.

TITLE
------------------------
PAYROLL
-------------------------
President 2500
Warehouse 6157
Sales 7380
Stock 9490
...  

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

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

Пример:

Для исправления этой ошибки следует добавить предложение GROUP BY.

Группы внутри групп.

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

Пример: Вывод количества служащих по должностям внутри отделов.

DEPT_ID
-----------
TITLE
-----------------------
COUNT(*)
--------------
...    
34 Sales Representative 1
34 Stock Clerk 1
35 Sales Representative 1
41 Stock Clerk 2
41 VP, Operations 1
...    

Предложение HAVING.

Предложение WHERE для исключения групп не используется. Для исключения целиком некоторых групп следует пользоваться предложением HAVING.

Пример: Вывод номера отдела и средней заработной платы для отделов, где средняя заработная плата превышает 2000.

Вместо этого для ограничения количества групп следует использовать предложение HAVING.

DEPT_ID
------------------
AVG(SALARY)
----------------------------
50 2025

Предложение HAVING задает условие отбора групп для вывода. Следовательно, на группы накладывается дальнейшее ограничение, основанное на сводной информации.

Синтаксис:

SELECT {столбец, групповая_функция}
FROM Таблица
[WHEREусловие]
[GROUP BY выражение_группирования]
[HAVINGусловие_группы]
[ORDER BY{Столбец, выражение}[ASC|DESC]];

где

HAVING

Вывод конкретных групп.

Условие_группы

Включает в выходной результат только те группы, для которых заданное условие истинно (TRUE).

Если используется предложение HAVING, сервер Oracle7 выполняет следующие действия:

Предложение HAVING может предшествовать предложению GROUP BY, но более логично ставить предложение GROUP BY первым. Образование групп и вычисление групповых функций происходят до того, как к группам из списка SELECT применяется ограничение, заданное в предложении HAVING.

Пример: Вывод должности и общей заработной платы для всех должностей с заработной платой более 5000 в месяц, кроме вице-президентов. Выходные строки сортируются по заработной плате.

Сервер Oracle7 рассматривает предложения в следующем порядке:

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

Для закрепления материала рекомендуется выполнить Практическое задание 4.


Назад    Оглавление    Далее