Оценить:
 Рейтинг: 0

Основы программирования в СУБД Oracle. SQL+PL/SQL.

Год написания книги
2020
<< 1 ... 17 18 19 20 21 22 23 24 >>
На страницу:
21 из 24
Настройки чтения
Размер шрифта
Высота строк
Поля

– если rating_e <3 и salary <5000, то category = ?Low?;

– у остальных сотрудников category = ?Middle?.

Глава 4. Агрегатные функции и группировка данных

Агрегатные функции

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

Таблица 4.1. Агрегатные функции

Синтаксис агрегатных функций:

{имя функции} ({Аргумент})

где: expr – аргумент агрегатной функции, который может содержать следующие элементы:

[DISTINCT] {имя столбца} | {выражение} | {однострочная функция}

Следует обратить внимание на то, что аргументом групповой функции может быть однострочная функция. Хотя стандарт языка SQL запрещает использование агрегатных функций в качестве аргумента агрегатных функций, СУБД Oracle допускает это, но только на один уровень в глубину и только в предложении SELECT. Рассмотрим примеры использования агрегатных функций.

Пример 4.1. Вывод обобщенных данных о зарплате сотрудников

SELECT MIN (salary) AS minimum, MAX (salary) AS maximum, ROUND (AVG (salary)) AS medium, SUM (salary) As summa, COUNT (salary), COUNT (*)

FROM Employees;

В полученном результате следует обратить внимание на то, что:

– COUNT (salary) возвращает число сотрудников, получающих зарплату, у которых значение столбца salary не NULL;

– COUNT (*) возвращает число всех сотрудников.

Этот запрос не учитывает то, что некоторые сотрудники получают комиссионные. Зарплата сотрудника с учетом комиссионных может быть вычислена путем использования выражения:

salary * (1 + NVL (commission_pct,0))

Используя это выражение в предыдущем запросе, вместо столбца salary получим:

Пример 4.2. Вывод обобщенных данных о зарплате сотрудников с учетом комиссионных

SELECT MIN (salary* (1+NVL (commission_pct,0))) AS minimum,

MAX (salary* (1+NVL (commission_pct,0))) AS maximum,

ROUND (AVG (salary* (1+NVL (commission_pct,0)))) AS medium,

SUM (salary* (1+NVL (commission_pct,0))) As summa,

COUNT (salary* (1+NVL (commission_pct,0))) AS ??COUNT (expr) ??,

COUNT (*)

FROM Employees;

Пример 4.3. Использование функции COUNT

SELECT COUNT (*), COUNT (salary),COUNT (DISTINCT salary),

COUNT (commission_pct)

FROM Employees

WHERE department_id =80;

Анализ результатов этого запроса:

– COUNT (*) – вернула число сотрудников в отделе 80;

– COUNT (salary) – вернула число сотрудников в отделе 80,

у которых значение столбца salary не NULL;

– COUNT (DISTINCT salary) – вернула число различных значений в столбце salary;

– COUNT (commission_pct) – вернула число сотрудников в отделе 80, у которых значение столбца commission_pct не NULL.

Оператор DISTINCT используется для исключения повторяющихся значений. Например, необходимо определить количество должностей. Запрос без оператора DISTINCT вернет количество сотрудников, у которых значение столбца job_id не NULL.

Пример 4.4. Количество сотрудников, у которых значение столбца job_id не NULL

SELECT COUNT (job_id)

FROM Employees;

Если в аргумент функции COUNT добавить оператор DISTINCT, то будут исключены повторяющиеся значения столбца job_id и запрос вернет количество должностей (количество уникальных значений столбца job_id).

Пример 4.5. Количество уникальных значений столбца job_id

SELECT COUNT (DISTINCT job_id)

FROM Employees;

Задача: требуется определить средний размер комиссионных. Рассмотрим два варианта решения этой задачи.

Вариант 1

SELECT AVG (commission_pct)
<< 1 ... 17 18 19 20 21 22 23 24 >>
На страницу:
21 из 24