На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается исключительно для обсуждения вопросов использования языка запросов SQL. Обсуждение общих вопросов, связанных с тематикой баз данных - обсуждаем в разделе "Базы данных: общие вопросы". Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Akina
  
> Помогите написать запрос , Не получается выполнить последнее условие
    Вы — 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.
      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
      Скрытый текст
      ExpandedWrap disabled
        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
        ann Укажите точно используемую СУБД. Приведите не описание полей таблицы, а её CREATE TABLE.

        macomics, ну как так? Все рассуждения - по делу, а текст запроса - ну просто обняться и плакать!
          -- создание таблицы
          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
            Должен еще фелиал 3 вывести с bonus_total = 0
            Прикреплённый файлПрикреплённый файл2025_07_26_14_45_37.png (24,41 Кбайт, скачиваний: 20)

            Добавлено
            Извините, не увидела текст запроса.
            В Postgres order by может идти только после group by

            Добавлено
            И условие
            Даже если у филиала ноль сотрудников с бонусом, его нужно включить в таблицу со значением bonus_total = 0.
            Не выполняется. Вопрос пока не решен
              Ну почему вот обязательно хоть что-то, да через задницу! Ну с каких пор Постгресс дефолтом стал понимать литералы даты в формате ДД.ММ.ГГГГ?

              ExpandedWrap disabled
                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
                Цитата Akina @
                employment_date<'2023-12-30'::TIMESTAMP

                включительно
                employment_date<'2023-12-31'::TIMESTAMP
                  Спасибо, вопрос решен.
                  Не знаю точно когда, у меня версия 9.4, понимает и в таком формате дату.
                    Цитата ann @
                    у меня версия 9.4, понимает и в таком формате дату.

                    Это особенность локальной настройки сервера. Но при публикации кода на форуме желательно всё же придерживаться стандарта, либо добавлять соотв. команды установки параметров сессии.
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0314 ]   [ 16 queries used ]   [ Generated: 15.09.25, 11:22 GMT ]