Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нужна помощь с sql запросом  [new]
LittleLady
Member

Откуда:
Сообщений: 12
Сижу ломаю голову над задачкой:
Есть 2 таблицы:
orders – инфа о заказах (order_id) в ателье головных уборов; сотруднике (employee_id), выполнившем заказ; дате оформления заказа (order_dt) и дате выполнения заказа (finish_dt);
schedule – таблица с информацией о графике работы сотрудников ателье (календарь со всеми датами для всех сотрудников). Содержит поля: сотрудник (employee_id), дата (date) и флаг выходного дня у сотрудника (holiday_flg, заполнение: Y – у сотрудника выходной день, N – рабочий день).
Написать запрос, который выводит результирующую таблицу с полями:
employee_id - сотрудник;
order_cnt - количество заказов каждого сотрудника, выполненных в срок не более 5 рабочих дней (рабочими считаются дни, помеченные флагом holiday_flg = ‘N’ в таблице schedule) ;
hundred_flg (Y/N) - флаг, превысило ли кол-во заказов, выполненных в срок не более 5 рабочих дней, у сотрудника 100шт.

По одному из общих условий задачи создавать новые объекты нельзя, следовательно вопрос как добавить к выборке новые поля, если они не фигурируют в искомых таблицах? И как прописать запрос на выборку в поля order_cnt и hundred_flg так, чтобы в итоге на всё получился один запрос?
Скрипты на создание таблиц и заполнение тестовыми данными:
Orders

Create table orders (
order_id int not null,
employee_id int not null,
order_dt datetime2 not null,
finish_dt datetime2 null
);
Go
Insert into orders('order_id', 'employee_id', 'order_dt', 'finish_dt') Values ('1','1','04-20-2018','04-25-2018' )
Go
Insert into orders('order_id', 'employee_id', 'order_dt', 'finish_dt') Values ('2','1','04-20-2018','04-30-2018' )
Go
Insert into orders('order_id', 'employee_id', 'order_dt', 'finish_dt') Values ('3','5','07-05-2018','08-30-2018' )
Go

schedule

Create table shedule (
employee_id int not null,
date datetime2 not null,
holiday_flg varchar(10) not null
);
Go
Insert into orders('employee_id', 'date', 'holiday_flg ') Values ('1','04-20-2018','Y' )
Go
Insert into orders('employee_id', 'date', 'holiday_flg ') Values ('2','04-20-2018','N')
Go
Insert into orders('employee_id', 'date', 'holiday_flg ') Values ('5','04-20-2018','Y' )
Go
СУБД MS SQL SERVER

Буду благодарна за помощь :) Несколько дней уже бьюсь над решением задачи
20 май 19, 05:37    [21888484]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с sql запросом  [new]
aleks222
Member

Откуда:
Сообщений: 971
declare @orders table  (
order_id int not null, 
employee_id int not null, 
order_dt datetime not null, 
finish_dt datetime null
);

Insert into @orders(order_id, employee_id, order_dt, finish_dt) Values ('1','1','20180420','20180425' )
Insert into @orders(order_id, employee_id, order_dt, finish_dt) Values ('2','1','20180420','20180430' )
Insert into @orders(order_id, employee_id, order_dt, finish_dt) Values ('3','5','20180705','20180830' )

select * from @orders;

declare @shedule table  (
employee_id int not null, 
date datetime not null, 
holiday_flg varchar(10) not null
);
Insert into @shedule(employee_id, date, holiday_flg) Values ('1','20180420','Y' )
Insert into @shedule(employee_id, date, holiday_flg) Values ('1','20180421','N' )
Insert into @shedule(employee_id, date, holiday_flg) Values ('2','20180420','N')
Insert into @shedule(employee_id, date, holiday_flg) Values ('5','20180420','Y' )

select * from @shedule;
 
;
with o as ( select * from @orders )
   , s as ( select * from @shedule ) 
   -- дни исполнения заказов
   , os as ( select o.*, s.date, s.holiday_flg from  o inner join s on s.employee_id = o.employee_id and s.holiday_flg = 'N' and s.date between o.order_dt and o.finish_dt )
   -- кол-во дней исполнения заказов
   , odc as ( select employee_id, order_id, cntDays = count(*) from os group by employee_id, order_id )
   -- кол-во дней исполнения заказов <= 5
   , odc5 as ( select * from odc where cntDays <= 5 )
   -- трудоголики с днями исполнения заказов <= 5 + флаг 100
   , odc5f100 as ( select employee_id, f100 = case when count(*) > 100 then 'Y' else 'N' end  from odc5 group by employee_id)
 select * from odc5f100
20 май 19, 06:18    [21888489]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с sql запросом  [new]
LittleLady
Member

Откуда:
Сообщений: 12
aleks222,

Спасибо огромное! :)
20 май 19, 23:07    [21889265]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить