Базы данных
и язык SQL

Решение примера 3 на запросы с оператором UNION

Пример 3. В базе данных фирмы есть таблица Staff, содержащая данные о сотрудниках фирмы. В ней есть столбцы Name (фамилия), Dept (номер отдела), и Years (длительность трудового стажа).

NameDeptYears
Sanders207
Pernal208
Marenghi385
Doctor205
Factor388

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

Решение. Первый запрос возвращает индивидуальные размеры длительности трудового стажа, упорядоченные по номерам отделов:

SELECT Name, Dept, Years FROM STAFF ORDER BY Dept

Второй запрос вернёт средний размер стажа по отделам. Условием соединения является равное число столбцов, совпадение их названий, порядка следования и типов данных. Поэтому включаем в таблицу с итогами также столбец Name с произвольным значением 'Z-AVG':

SELECT 'Z-AVG' AS Name, Dept, AVG(Years) AS Years FROM STAFF GROUP BY Dept

Теперь объединим запросы при помощи оператора UNION и применим оператору ORDER BY к результату объединения. Группировать следует по двум столбцам: номер отдела (Dept) и имя (Name), чтобы строки с итоговыми (средними) значениями, в которых значение имени - NULL, находились выше строк с индивидуальными значениями. Объединение результатов запросов будет следующим:

(SELECT Name, Dept, Years FROM STAFF) UNION (SELECT 'Z-AVG' AS Name, Dept, AVG(Years) AS Years FROM STAFF GROUP BY Dept) ORDER BY Dept, Name

Результатом выполнения запроса с оператором UNION будет следующая таблица, в которой каждая первая строка в каждой группе отделов будет содержать среднюю длительность трудового стажа сотрудников, работающих в этом отделе:

NameDeptYears
Doctor205.0000
Pernal208.0000
Sanders207.0000
Z-AVG206.6667
Factor388.0000
Marenghi385.0000
Z-AVG386.5000