
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
![]() | Данный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ. |
Сообщ.
#1
,
|
|
|
Вы — HR-аналитик в крупной ритейл-компании. По трудовому договору сотрудники компании получают новогоднюю премию (дата выплаты — 2024-12-31) при условии, что за весь год они совершили от 15 продаж включительно, сумма которых составила строго более 100000 рублей, и при этом они ни разу не опоздали на работу.
Нужно учесть, что премии могут получить только те сотрудники, которые были трудоустроены более чем за 1 год до даты выплаты премии (до 30 декабря 2023 включительно). Для каждого филиала компании определите, какое количество его сотрудников получит премию. Формат ввода Таблица employees: • employee_id (int) — уникальный идентификатор сотрудника • department (string) — филиал компании • employment_date (date) — дата трудоустройства • sales_numb (int) — количество продаж сотрудника • sales_sum (int) — сумма продаж сотрудника • late_days (int) — кол-во опозданий Данные не содержат пропусков или некорректных значений. Формат вывода Запрос должен вернуть таблицу с полями в таком порядке: • department (string) — филиал компании • bonus_total (int) — количество сотрудников с премией (≥0) Выходные данные отсортированы по филиалу (по алфавиту от А до Я). Даже если у филиала ноль сотрудников с бонусом, его нужно включить в таблицу со значением bonus_total = 0. |
Сообщ.
#2
,
|
|
|
1) Выясняем условия выборки:
1.1) за весь год они совершили от 15 продаж включительно sales_numb >= 15 1.2) сумма которых составила строго более 100000 рублей sales_sum > 100000 1.3) они ни разу не опоздали на работу late_days = 0 1.4) были трудоустроены более чем за 1 год до даты выплаты премии (до 30 декабря 2023 включительно) employment_date <= 2023-12-30 2) Определяем форму сортировки 2.1) Выходные данные отсортированы по филиалу (по алфавиту от А до Я) ORDER BY department ASC 3) Определяем группировку данных 3.1) Запрос должен вернуть таблицу с полями в таком порядке: department, bonus_total GROUP BY department 4) Имя таблицы очевидно: FROM employees 5) Выбор полей определен в задании: department и bonus_total Осталось все это соединить в SELECT Скрытый текст ![]() ![]() SELECT department, COUNT(employment_date) AS bonus_total FROM employees WHERE employment_date <= '2023-12-30' AND sales_numb >= '15' AND sales_sum > '100000' AND late_days = '0' ORDER BY department ASC GROUP BY department |
![]() |
Сообщ.
#3
,
|
|
ann Укажите точно используемую СУБД. Приведите не описание полей таблицы, а её CREATE TABLE.
macomics, ну как так? Все рассуждения - по делу, а текст запроса - ну просто обняться и плакать! |
Сообщ.
#4
,
|
|
|
-- создание таблицы
create table employees( employee_id int, -- уникальный идентификатор сотрудника department varchar, -- филиал компании employment_date date, -- дата трудоустройства sales_numb int, -- количество продаж сотрудника sales_sum int, -- сумма продаж сотрудника late_days int -- кол-во опозданий ); --заполнение таблицы insert into employees values (1,'Филиал1','24.07.2022',15,10000000,0), (2,'Филиал1','24.07.2023',22,1020000,1), (3,'Филиал2','24.07.2022',18,9990000,0), (4,'Филиал2','24.07.2021',17,999000,0), (4,'Филиал2','24.07.2021',12,999000,3), (4,'Филиал3','24.07.2024',15,9990000,0); Добавлено Postgres Добавлено Даже если у филиала ноль сотрудников с бонусом, его нужно включить в таблицу со значением bonus_total = 0. Вот это условие не получается, можете пожалуйста в селект объединить? У меня вот так получаилось, но результат не содержит результата Филиал3 0. В этом вопрос этой темы. SELECT department, count(employee_id) as bonus_total FROM employees WHERE employment_date<'30.12.2023'::TIMESTAMP AND sales_numb>=15 AND sales_sum>1000000 AND late_days=0 group by department order by department asc |
Сообщ.
#5
,
|
|
|
Должен еще фелиал 3 вывести с bonus_total = 0
Прикреплённый файл ![]() Добавлено Извините, не увидела текст запроса. В Postgres order by может идти только после group by Добавлено И условие Даже если у филиала ноль сотрудников с бонусом, его нужно включить в таблицу со значением bonus_total = 0. Не выполняется. Вопрос пока не решен |
![]() |
Сообщ.
#6
,
|
|
Ну почему вот обязательно хоть что-то, да через задницу! Ну с каких пор Постгресс дефолтом стал понимать литералы даты в формате ДД.ММ.ГГГГ?
![]() ![]() SELECT department, SUM(CASE WHEN employment_date<'2023-12-30'::TIMESTAMP AND sales_numb>=15 AND sales_sum>1000000 AND late_days=0 THEN 1 ELSE 0 End) as bonus_total FROM employees group by department order by department asc; fiddle |
Сообщ.
#7
,
|
|
|
Цитата Akina @ employment_date<'2023-12-30'::TIMESTAMP включительно employment_date<'2023-12-31'::TIMESTAMP |
Сообщ.
#8
,
|
|
|
Спасибо, вопрос решен.
Не знаю точно когда, у меня версия 9.4, понимает и в таком формате дату. |
![]() |
Сообщ.
#9
,
|
|
Цитата ann @ у меня версия 9.4, понимает и в таком формате дату. Это особенность локальной настройки сервера. Но при публикации кода на форуме желательно всё же придерживаться стандарта, либо добавлять соотв. команды установки параметров сессии. |