显示在特定时间段内尚未下订单的所有客户



对SQL和数据库相当陌生。。。。我有以下问题。。。对于一家航运公司的数据库,三个相关的表格分别针对这个问题;

客户(客户ID、名称、地址等(

发货(ShipmentID,ScheduleName,DepartDate,ArriveDate,DepartPort,ArrivePort(

客户订单(客户ID、发货ID、费用等(

我需要展示"所有在特定年份(即2019年(内没有下订单的客户"我很难找到正确的查询。我正在处理样本数据,数据库中有8个客户,其中3个有2019年发货的订单。因此,我希望得到的结果是剩下的5个没有订单的客户的名单。

我可以很容易地向已经下单的客户和从未下单的客户展示,但我很难向那些在特定时间段内没有下单的客户演示。

任何想法或提示都将不胜感激!

感谢

编辑***

期望结果-显示尚未下订单的5位客户,发货日期为2019

我试过了;

~从客户中选择客户IDLEFT OUTER JOIN客户订单ON Customer.CustomerID=客户订单.CustomerIDLEFT OUTER JOIN装运ON CustomerOrder.ShipmentID=发货.ShipmentID装运地点。离开日期介于"2019-01-01"one_answers"2019-12-31"之间AND CustomerOrder.CustomerID为空~

然而,这并没有带来任何结果。

这三个表具有以下信息

客户-(简单的客户详细信息表((客户ID、名称、地址、电话、类型、规模、注册日期(

发货-(详细说明每批计划发货((发货ID、时间表名称、出发日期、出发港、到达日期、到达港、季节(

客户订单-(详细说明客户订单,但不包括订单上的单个项目((订单ID、发货ID、客户ID(

我不确定是不是加入才是问题所在?在样本数据中,2019年有4次发货,共有3个客户。我需要出示在这些日期内没有下订单的5位客户的客户ID。

我尝试了一些不同的查询,一直在网上搜索,但我是新手,不太确定哪里出了问题。我能够识别从未下过订单的客户,但一旦我添加日期范围,我就没有结果。

所需结果-显示尚未下订单的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'
);

我现在不知道你在哪里保存订单日期,但如果需要,你可以更改任何内容。我使用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

我认为这可能是您想要的解决方案,这里是完整的查询。子查询意味着你可以获得2019年所有订单的客户ID,我们排除了主题不在。。。

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)

只需在不存在customerId的适当日期范围内按customerId对订单进行左外部联接:

select c.* 
from customers c
left outer join (
select customerID 
from CustomerOrder o 
join Shipment s on s.ShipmentID=o.ShipmentID 
where DepartDate>='2020-01-01' and DepartDate<'2021-01-01'
) x on x.customerID=c.customerID  
where x.customerid is null

子查询选择在该日期范围内订购的每个客户ID。左边的外部连接和";customerid为空";对那些不存在于我们的子查询中的客户进行负匹配。

最新更新