【发布时间】:2016-09-22 14:22:27
【问题描述】:
我是新手,我已经在 GUI 中提取了一个查询。
我有一个加入设置,所以所有抱怨的客户都在左表中,所有完成的工作都在右表中。
两个表都有客户参考号,所以我根据这个加入了。
在我们进行任何工作之前,客户可能会抱怨,因此该表是左联接。
我遇到的问题是一个客户可能有多个工作项,所以当我创建连接时,投诉表中的每一行都会被多次返回,如果他们执行了多个工作项。
我需要在联接中添加一些逻辑,以便它只为每个投诉带回一个工作项。如果存在多个工作项,则希望查询返回工作项,其日期最接近投诉日期,但绝不会在投诉日期之后。
如果投诉没有在它之前发生的工作项,我仍然希望显示投诉但包含来自工作项的数据。
我只知道如何使用设计器 GUI,但 SQL 现在看起来像这样:
SELECT DISTINCT [CEAR326 Master Data fo access1].ID,
ReportingCategory.ReportingCategory,
[CEAR326 Master Data fo access1].Category,
[CEAR326 Master Data fo access1].[Sub Category],
[CEAR326 Master Data fo access1].[Contact Partner],
main_Tbl_ServiceOrder.ServiceProduct, SOType.SOType,
Format([Actual Date From],"mmm-yy") AS [Date],
[CEAR326 Master Data fo access1].[Actual Date From],
main_Tbl_ServiceOrder.BasicStartDate,
[CEAR326 Master Data fo access1].Smart_Flag
FROM (([CEAR326 Master Data fo access1]
LEFT JOIN main_Tbl_ServiceOrder ON [CEAR326 Master Data fo access1].[Contact Partner] = main_Tbl_ServiceOrder.BusinessPartnerNumber)
LEFT JOIN ReportingCategory ON [CEAR326 Master Data fo access1].Category = ReportingCategory.Category) LEFT JOIN SOType ON main_Tbl_ServiceOrder.ServiceProduct = SOType.ServiceOrder
WHERE (((main_Tbl_ServiceOrder.BasicStartDate)<="actual Date from" Or (main_Tbl_ServiceOrder.BasicStartDate)="0" Or (main_Tbl_ServiceOrder.BasicStartDate) Is Null))
ORDER BY [CEAR326 Master Data fo access1].[Contact Partner], main_Tbl_ServiceOrder.BasicStartDate;
我相信 Select distinct 没有按要求工作,因为这条线
main_Tbl_ServiceOrder.ServiceProduct, SOType.SOType,
这是我希望我的 where 语句出现的地方,并通过查看与 CEAR [实际日期自] 日期相关的服务订单日期来选择相关服务订单。
我还认为,如果当前的 WHERE 语句返回多个服务订单,如果它们发生在 CEAR 之前,它们就会出现问题。我只想返回最接近 CEAR 日期的那个。
【问题讨论】:
-
你有没有机会想出一个更简单的例子(比如两个表,每个表只有几列),它表现出相同的问题,最好是样本数据和预期结果?
-
您的
WHERE条件看起来不正确。我假设BasicStartDate是一个日期字段,因此您需要"Actual Date From"标准为(main_Tbl_ServiceOrder.BasicStartDate)<=[CEAR326 Master Data fo access1].[Actual Date From]。否则,您将日期与文本字符串“实际日期来自”进行比较,这对我来说看起来不正确。不过,您仍然可能有重复项,因此我会在此之后创建一个堆叠查询,以便从该查询的结果中获取MAX([BasicStartDate])。这应该只留下最接近 CEAR 日期的服务订单,而不是在 CEAR 日期之后。