Создайте запрос, который отображает сотрудников, у которых не было продаж за последние 3 дня с даты, клиентам из США. база данных Northwind

Я хочу получить сотрудников, не проданных за последние 3 дня до 25 января 1997 года, клиентам из "США".

Таблица заказов

OrderID CustomerName    EmployeeId  Orderdate
10248   C1               1             1997-01-25 00:00:00:000
10249   C2               3             1997-0-24 00:00:00:000
10250   C3               2             1997-01-23 00:00:00:000
10251   c4               5             1997-01-22 00:00:00:000
10251   c5               4             1997-01-23 00:00:00:000

Сотрудники

EmployeeID  Emp_name
1            E1
2            E2  and so on till e5

Клиенты

CustomerID   Country
C1            USA
C2            UK
C3            Brazil
C4            UK 
C5            USA

Желаемый результат

EmployeeID
2
3
5

Запрос выполнен

select EmployeeID
from Employees e1
where employeeid not in
(
    select o.EmployeeID
    from orders o
    full join customers c on o.CustomerID=c.CustomerID
    where c.Country = 'USA' 
    and o.RequiredDate >= dateadd(day,-3, '1997-01-25')
)
  • Всего было от e1 до e5 сотрудников.
  • e1 обслужил клиента c1 25 января 1997 года. c1 из США
  • e4 обслужил клиента c4 23 января 1997 г. (за 3 дня до 25 января 1997 г.), а c4 из США.
  • Так что получите список сотрудников не в e1 и e4 из общего списка сотрудников.

Однако я получаю пустой результат, так как ни одной строки. может кто-нибудь, пожалуйста, помогите. (это всего лишь образец): данные из базы Northwind. Я только что создал образцы данных на случай, если у кого-то нет базы данных Northwind


person noob    schedule 09.05.2020    source источник
comment
Было бы действительно полезно, если бы вы могли начать предоставлять операторы DDL / DML для создания образцов данных в ваших вопросах. Помогает людям ответить на них.   -  person Dale K    schedule 09.05.2020
comment
Я должен спросить, вы задаете большое количество вопросов, многие из которых очень похожи, вы учитесь на собственном опыте? Я бы уже подумал, что вы сможете написать некоторые из этих запросов самостоятельно. Я думаю, я видел, как вы упомянули, что это вопросы для собеседования - если вы на самом деле не понимаете, как это сделать самостоятельно, это не поможет вам в работе?   -  person Dale K    schedule 09.05.2020
comment
full join вернет всех сотрудников при любых on условиях   -  person Serg    schedule 09.05.2020
comment
Ваш синтаксис, если он неверен на базовом уровне, например select EmployeeID, from уже сломан, у него есть лишняя запятая, которая не компилируется. Если это то, что вы действительно пробовали, то это даже не сработало?   -  person Dale K    schedule 09.05.2020
comment
Это пример того, как чтобы настроить для нас операторы DDL / DML. Это значительно упрощает ответ на ваш вопрос.   -  person Dale K    schedule 09.05.2020
comment
Спасибо за предложение, но никого не заставляют решать проблему. SO - это платформа, на которой люди решают проблемы друг друга. Давайте избегать личных и непрофессиональных замечаний, пожалуйста. Если вы считаете, что конкретный вопрос бесполезен, пожалуйста, не отвечайте на него и не игнорируйте его ... Тем не менее, я принял ваше предложение по DDL.   -  person noob    schedule 09.05.2020


Ответы (1)


Основываясь исключительно на данных таблицы, которые вы «предоставили», проблема в том, что вы ищете целочисленный идентификатор сотрудника, а ваш подзапрос возвращает список имен сотрудников. Поэтому, если вы измените его как таковой, вы получите правильный ответ:

CREATE TABLE #Orders (OrderID int, CustomerName varchar(20), EmployeeName varchar(20), Orderdate datetime)
INSERT INTO #Orders VALUES
(10248, 'C1', 'E1', '1997-01-25 00:00:00:000'),
(10249, 'C2', 'E3', '1997-01-24 00:00:00:000'),
(10250, 'C3', 'E2', '1997-01-23 00:00:00:000'),
(10251, 'c4', 'e5', '1997-01-22 00:00:00:000'),
(10251, 'c5', 'e4', '1997-01-23 00:00:00:000')

CREATE TABLE #Employees (EmployeeID int, Emp_name varchar(10))
INSERT INTO #Employees VALUES
(1, 'E1'),
(2, 'E2'),
(3, 'E3'),
(4, 'E4'),
(5, 'E5')

CREATE TABLE #Customers (CustomerID varchar(10), Country varchar(20))
INSERT INTO #Customers VALUES
('C1', 'USA'),
('C2', 'UK'),
('C3', 'Brazil'),
('C4', 'UK' ),
('C5', 'USA')

select Emp_name
from #Employees e1
where Emp_name not in
(
    select o.EmployeeName
    from #orders o
    inner join #customers c on o.CustomerName = c.CustomerID
    where c.Country = 'USA' 
    and o.Orderdate >= dateadd(day,-3, '1997-01-25')
)
person JMabee    schedule 09.05.2020