对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为空";对那些不存在于我们的子查询中的客户进行负匹配。