Показать всех клиентов, которые не разместили заказ в указанные сроки c - PullRequest
0 голосов
/ 18 марта 2020

Совершенно новый для SQL и баз данных .... У меня есть следующая проблема ... База данных для транспортной компании, три соответствующие таблицы для этой проблемы:

Клиент (CustomerID, Имя, Адрес et c)

Отгрузка (ShipmentID, ScheduleName, DepartDate, ArriveDate, DepartPort, ArrivePort)

CustomerOrder (CustomerID, ShipmentID, Feet et c)

I нужно показать «Все клиенты, которые НЕ разместили заказ в течение определенного c года, то есть 2019 года», я пытаюсь найти правильный запрос для этого. Я работаю над выборочными данными, в базе данных есть 8 клиентов, у 3 из которых есть заказы на отправления, отправляемые в 2019 году. Поэтому в результате я надеюсь получить список из 5 оставшихся клиентов, у которых не было заказов на эти поставки.

Я могу легко показать клиентов, которые разместили заказ, и тех, кто никогда не размещал заказ, однако я изо всех сил стараюсь показать тем, кто не разместил заказ в указанный c период времени.

Любые идеи или советы будут с благодарностью!

Спасибо

РЕДАКТИРОВАТЬ ***

Желаемый результат - Показать 5 клиентов, которые не разместили заказ с датой отгрузки в 2019

I попробовал;

~ ВЫБЕРИТЕ CustomerID от клиента ЛЕВОЕ ВНЕШНЕЕ ПОДКЛЮЧЕНИЕ customerorder ON Customer.CustomerID = CustomerOrder.CustomerID ЛЕВОЕ ВНЕШНЕЕ ОБЪЕДИНЕНИЕ отгрузки ON CustomerOrder.ShipmentID = Shipment.ShipmentID ГДЕ shipment.DepartDate BETWEEN '2019-01-01' И '2019-12-31' И CustomerOrder.CustomerID НЕДЕЙСТВИТЕЛЬНО ~

Однако это не дает никаких результатов.

Три таблицы имеют следующую информацию

Клиент - (просто таблица данных клиента) (CustomerID, Имя, Адрес, Телефон, Тип, Размер, RegisteredSince)

Отгрузка - (Подробности каждой запланированной отправки) (ShipmentID, ScheduleName, DepartDate, DepartPort, ArriveDate, ArrivePort, Season)

CustomerOrder - (Подробности заказа клиента, но не отдельных элементов в заказе) (OrderID, ShipmentID, CustomerID)

Я не уверен, что проблема в соединении? В выборочных данных в 2019 году было 4 поставки с общим количеством 3 клиентов. Мне нужно показать идентификаторы клиентов из 5 клиентов, которые не разместили заказ в эти даты.

Я пробовал несколько разных запросов, искал в Интернете, но я новичок в этом и не совсем уверен, где я ошибаюсь. Я могу идентифицировать клиентов, которые никогда не размещали заказ, но как только я добавляю диапазоны дат, я не получаю результатов.

Ответы [ 3 ]

1 голос
/ 18 марта 2020

Желаемый результат - Показать 5 клиентов, которые не разместили заказ с датой отгрузки в 2019

Использование NOT EXISTS:

SELECT c.* 
FROM Customer c
WHERE NOT EXISTS (SELECT 1
                  FROM CustomerOrder co JOIN 
                       Shipment sh
                       ON co.shipmentID = sh.ShipmentID
                  WHERE c.CustomerID = co.CustomerID AND
                       sh.DepartDate >= '2019-01-01' AND
                       sh.DepartDate < '2020-01-01'
                 );
0 голосов
/ 18 марта 2020

Я думаю, что это может быть решение, которое вы хотите, вот полный запрос. Подзапрос означает, что вы получите все customerID-ы, которые сделали заказы на 2019 год, и мы исключаем тему с не в ...

SELECT c.* 
FROM Customer c
INNER JOIN CustomerOrder co ON c.CutomerID = co.CutomerID
INNER JOIN Shipment sh ON co.shipmentID = sh.ShipmentID
WHERE YEAR(sh.DepartDate) <> 2019 AND  c.CutomerID 
  NOT IN (SELECT c.* 
          FROM Customer c
          INNER JOIN CustomerOrder co ON c.CutomerID = co.CutomerID
          INNER JOIN Shipment sh ON co.shipmentID = sh.ShipmentID
          WHERE YEAR(sh.DepartDate) = 2019)
0 голосов
/ 18 марта 2020

Теперь я не знаю из ваших отношений, где вы сохраняете дату заказа, но вы можете изменить что угодно, если это необходимо. Я использовал DepartDate для управления годами заказов, которые отличаются от 2019 года: Пример:

SELECT c.* 
FROM Customer c
INNER JOIN CustomerOrder co ON c.CutomerID = co.CutomerID
INNER JOIN Shipment sh ON co.shipmentID = sh.ShipmentID
WHERE YEAR(sh.DepartDate) <> 2019

Получить все данные данные, где DepartDate не равно 2019

...