- •Многострочные функции (Multiple-row Functions).
- •1. Многострочные функции.
- •1.1 Типы функций агрегирования.
- •1.2 Использование функций avg и sum.
- •1.3 Использование функций min и max.
- •1.4 Использование функции count.
- •1.5 Функции агрегирования и неопределённые значения.
- •2. Создание групп данных.
- •2.1 Предложение group by.
- •2.2 Группировка по нескольким столбцам
- •2.3 Недопустимые примеры использования функций агрегирования
- •3. Исключение групп
- •3.1 Использование предложения having
- •4. Вложенные функции агрегирования.
2.1 Предложение group by.
С помощью предложения GROUP BYможно разделить строки таблицы на группы. Затем можно использовать функции агрегирования, чтобы получить сводную информацию по каждой группе.
Синтаксис:
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDERBYcolumn];
где group_by_expression- выражение группировки, которое задаёт столбцы, на основе значений которых группируются строки.
Указания.
Все столбцы в предложении SELECT, к которым не применяются функции агрегирования, должны быть указаны в предложенииGROUP BY;
Предложение WHEREпозволяет исключать строки до их группировки;
Список столбцов в предложении GROUP BYобязателен;
Использование псевдонимов столбцов в предложении GROUP BYзапрещено;
Пример 1.
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id ;
Пример 2.Такое использование так же является корректным:
SELECT AVG(salary)
FROM employees
GROUP BY department_id ;
Столбец, заданный в предложении GROUP BY. Может отсутствовать в списке столбцов предложения SELECT.
Пример 3.
SELECT AVG(salary)
FROM employees
GROUP BY department_id
ORDERBYAVG(salary) ;
2.2 Группировка по нескольким столбцам
Задача: показать общую сумму заработной платы, выплачиваемой по каждой должности в каждом отделе.
Решение: необходимо сгруппировать строки сначала по отделам, а затем внутри этих групп – по должностям.
Команда SELECT:
SELECT department_id, job_id, SUM(salary)
FROM employees
GROUP BY department_id, job_id
ORDER By department_id, job_id;
2.3 Недопустимые примеры использования функций агрегирования
Пример 1
SELECT department_id, COUNT(last_name)
FROMemployees
Сообщение об ошибке:
SELECT department_id, COUNT(last_name)
*
ERROR at line 1:
ORA-00937: not a single-group group function
Пример 2
SELECT department_id, AVG(salary)
FROM employees
WHERE AVG(salary) > 8000
GROUP BY department_id
Сообщение об ошибке:
WHERE AVG(salary) > 8000
*
ERROR at line 3:
ORA-00934: group function is not allowed here
Правила:
Предложение WHEREдля исключения групп не используется;
Для исключения групп следует использовать предложение HAVING;
Нельзя использовать функции агрегирования в предложении WHERE.
3. Исключение групп
Подобно тому, как предложение WHEREиспользуется для исключения строк, предложениеHAVINGиспользуется для исключения групп.
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDERBYcolumn];
где group_condition– ограничивающее условие, которое задаёт для групп строк условие, при выполнении которого они попадают в конечный результат.
Сервер Oracleобрабатывает предложениеHAVINGследующим образом:
Строки группируются
К группе применяются функции агрегирования
Выводятся группы, удовлетворяющие критериям в предложении HAVING.
Предложение HAVING может предшествовать предложению GROUP BY, но логичнее указать предложение GROUP BY первым.
3.1 Использование предложения having
Пример 1
SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id
HAVING MAX(salary) > 10000 ;
Результат:
DEPARTMENT_ID MAX(SALARY)
------------- -----------
100 12000
30 11000
90 24000
20 13000
110 12000
80 14000
Пример 2
SELECT job_id, SUM(salary) PAYROLL
FROM employees
WHERE job_id NOT LIKE '%REP%'
GROUP BY job_id
HAVING SUM(salary) > 13000
ORDER BY SUM(salary);
Результат:
JOB_ID PAYROLL
---------- ----------
PU_CLERK 13900
AD_PRES 24000
IT_PROG 28800
AD_VP 34000
ST_MAN 36400
FI_ACCOUNT 39600
ST_CLERK 55700
SA_MAN 61000
SH_CLERK 64300