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

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

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

FROM Employees;

Вариант 2.

SELECT AVG (NVL (commission_pct, 0))

FROM Employees;

Здесь правильный вариант решения не очевиден. У значительной части сотрудников значение столбца commission_pct имеет значение NULL. Если этим сотрудникам комиссионные не положены и они не должны учитываться, то правильным будет первый вариант. Если значение NULL следует считать равным нулю, то следует использовать второй вариант запроса.

Агрегатные функции нельзя использовать в предложении WHERE. Например, нельзя найти сотрудника с максимальной зарплатой, используя следующий запрос:

Пример 4.6a. Найти сотрудника, получающего максимальную зарплату

Внимание: ЭТОТ ЗАПРОС НЕ БУДЕТ ВЫПОЛНЕН!

SELECT employee_id, salary

FROM Employees

WHERE salary = MAX (salary);

Данную задачу можно решить следующим образом:

Пример 4.6б. Найти сотрудника, получающего максимальную зарплату

SELECT employee_id, salary AS maximum

FROM Employees

WHERE salary = (SELECT MAX (salary) FROM Employees);

Данный запрос содержит в предложении WHERE подзапрос. Использование подзапросов будет рассмотрено позже.

Группировка

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

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

FROM {таблица}

WHERE {условия}

GROUP BY {список столбцов*}

HAVING {условия на группу};

Списки столбцов в предложениях SELECT и GROUP BY должны совпадать.

Предложение GROUP BY разбивает данные на группы, и запрос выводит обобщенные данные о каждой группе.

Рассмотрим примеры задач, для решения которых необходимо использовать группировку и агрегатные функции.

Пример 4.7. Для каждого отдела определить суммарную зарплату

SELECT department_id, SUM (salary) AS SUM_salary

FROM Employees

GROUP BY department_id

ORDER BY department_id;

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

SELECT department_id, SUM (salary* (1+NVL (commission_pct,0)))

As sum_sal

FROM Employees

GROUP BY department_id

ORDER BY department_id;

Пример 4.9. Для каждого отдела определить суммарную длину имен (столбца first_name)

SELECT department_id, SUM (LENGTH (first_name)) As sum_f_nam

FROM Employees

GROUP BY department_id

ORDER BY department_id;

Группировка по нескольким столбцам

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

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

Пример 4.10а. Для каждого отдела определить должности и количество сотрудников, занимающих эту должность (содержит ошибку)

SELECT department_id, job_id, count (*)

FROM employees

GROUP BY department_id;
<< 1 ... 18 19 20 21 22 23 24 >>
На страницу:
22 из 24