Не могу в PostgreSQL создать запрос, содержащий сведения о сотрудниках, имеющих максимальный объём продаж
Всем привет! Делаю задания по базам данных PostgreSQL 16, которые нам дали (срок до 26 мая 23:59 по МСК). Последнее задание делаю, и тут столкнулся с некоторыми трудностями. Пытаюсь для максимального объёма продаж умножить количество покупателей на стоимость одной квартиры (не знаю, так я делаю или нет, сомневаюсь).
b) Создать запрос, содержащий сведения о сотрудниках, которые имеют максимальный объем продаж: ID_сотрудника, должность (если есть), ФИО, Сумма продаж. Сортировка записей – по сумме продаж.
Мой код запроса про сведения о сотрудниках:
SELECT cod_prodavtsa AS ID_Сотрудника, fio_prodavtsa AS ФИО, dolzhnost AS Должность,
COUNT(id_klient) * stoimost AS Сумма_продаж
FROM dannyie_o_prodavtse
JOIN objekt_nedvizhimosti ON dannyie_o_prodavtse.id_prodavtsa =
objekt_nedvizhimosti.cod_prodavtsa, kharakteristika_objekta_nedvizhimosti;
После запуска выводится такая ошибка:
ERROR: столбец "objekt_nedvizhimosti.cod_prodavtsa" должен фигурировать в предложении
GROUP BY или использоваться в агрегатной функции
LINE 1: SELECT cod_prodavtsa AS ID_Сотрудника, fio_prodavtsa AS ФИО,...
^
ОШИБКА: столбец "objekt_nedvizhimosti.cod_prodavtsa" должен фигурировать в предложении
GROUP BY или использоваться в агрегатной функции
SQL state: 42803
Character: 8
Что я не так делаю? Скидываю все таблицы, которые я смог сделать.
Текст последнего задания
Используя конструкции языка SQL, создайте запросы на выборку к БД, созданной согласно вашему варианту:
a) Создать запрос, содержащий ФИО клиента, его ID и номер заказа. Сортировка записей – по фамилии клиента, а для одинаковых фамилий – по именам и отчествам (если и имена будут совпадать).
SELECT fio_pokupatelya AS ФИО_клиента, id_klient AS ID_Клиента, cod_objekta AS Номер_заказа
FROM dannyie_pokupatelya LEFT JOIN objekt_nedvizhimosti
ON dannyie_pokupatelya.id_pokupatelya = objekt_nedvizhimosti.id_klient
ORDER BY ФИО_клиента;
b) Создать запрос, содержащий сведения о сотрудниках, которые имеют максимальный объем продаж: ID_сотрудника, должность (если есть), ФИО, Сумма продаж. Сортировка записей – по сумме продаж.
Именно в пункте b) возникли трудности.
c) Создать запрос для отбора сведений о сотрудниках, возраст которых меньше заданного. Поля запроса: Фамилия, Имя, Отчество, Должность (если есть), Оклад (если есть), Возраст (данное поле является вычисляемым). Сортировка записей – по возрасту.
SELECT fio_prodavtsa AS ФИО_сотрудника, dolzhnost AS Должность, oklad AS Оклад,
EXTRACT(YEAR FROM TIMESTAMP 'NOW()') - EXTRACT(YEAR FROM data_rozhdenia) AS Возраст
FROM dannyie_o_prodavtse
ORDER BY Возраст;
d) Создать итоговый запрос, вычисляющий количество сотрудников в каждом отделе (если отделов нет, то создать). Группировка – по полю Название отдела. Для подсчета количества сотрудников использовать функцию Count (например, в поле Фамилия).
SELECT otdelenie AS Название_отдела, COUNT(fio_prodavtsa)
FROM dannyie_o_prodavtse
GROUP BY Название_отдела;
Таблицы, где я делал запросы:
Данные покупателя
Объект недвижимости
Данные о продавце
Характеристика объекта недвижимости
Ответы (1 шт):
Создать запрос, содержащий сведения о сотрудниках, которые имеют максимальный объем продаж. [...] Сортировка записей – по сумме продаж
Вот у вас даже русским языком написано про сумму
. Нужно сгруппировать по id
сотрудника и суммировать стоимости внутри этой группы. Всё.
SELECT SUM(stoimost) ...
...
GROUP BY id_sotrudnika
ORDER BY SUM(stoimost) DESC
Умножать ничего не нужно. Вот представьте, сотрудником были проданы 3 отдельных яблока ценой 1р, 2р, 3р. Что тут умножать и зачем? Просто суммируете по каждому сотруднику продажи (за счёт группировки), и всё.
P.S. Чтобы не повторяться, в ORDER BY
можно указать алиас поля, либо порядковый номер поля в SELECT
. Но можно и SUM
продублировать, с точки зрения оптимизации запроса разницы вроде не будет.