我正在尝试为正在进行流程的客户加入两个表。所有客户都进入第一步,但只有一些进展到第二步(表2)。 客户可以在不同时间多次启动此过程,并且可以在无,一个或多个月内进入第二步。我想知道有多少人取得这样的进展。 表格为例:
TABLE_1
Cust1 1-Jan
Cust2 10-Jan
Cust3 15-Jan
Cust1 2-Feb
TABLE_2
Cust1 5-Jan
Cust2 16-jan
我的返回结果的查询是:
SELECT t1.Cust, t1.Date1, t2.Date2
FROM Table_1 t1
LEFT JOIN Table_2 t2 ON t1.Cust = t2.Cust
WHERE t2.Date is missing OR (t2.Date - t1.Date > 0 AND t2.Date - t1.Date < 10);
返回:
Cust1 1-Jan 5-Jan
Cust2 10-Jan 16-Jan
Cust3 15-Jan
当我想要返回的查询是:
Cust1 1-Jan 5-Jan
Cust1 2-Feb
Cust2 10-Jan 16-Jan
Cust3 15-Jan
查询似乎将2月2日和5月1日加入Cust1,然后将其删除,因为它与过滤器不匹配。但我需要过滤器,因为Cust1在三月份回来了。如何将这个二月份的条目保留在最终输出中?救命!
答案 0 :(得分:5)
将where
条件放入on
子句:
SELECT t1.Cust, t1.Date1, t2.Date2
FROM Table_1 t1
LEFT JOIN Table_2 t2 ON t1.Cust = t2.Cust
AND t2.Date - t1.Date > 0
AND t2.Date - t1.Date < 10
答案 1 :(得分:3)
我想,客户可以每月开始一次流程(至少是我观察到的流程),所以可以联系起来:
SELECT t1.Cust, t1.Date1, t2.Date2
FROM Table_1 t1
LEFT JOIN Table_2 t2 ON (t1.Cust = t2.Cust AND DATEDIFF(MONTH, t1.Date1, t2.Date2) = 0)
通常情况下,您可以使用DATEDIFF
指定更短的时间段,即如果您希望此差异小于10天,则可以使用:
DATEDIFF(DAY, t1.Date1, t2.Date2) <= 10
答案 2 :(得分:2)
查询似乎将2月2日和5月1日加入Cust1,然后将其删除,因为它与过滤器不匹配。
右!!这是因为,每当你在WHERE子句中使用LEFT JOINed Table时,这将改变LEFT JOIN的行为并充当INNER JOIN,并且你知道INNER JOIN只返回匹配的记录。
解决此问题的方法使用WHERE子句条件IN连接逻辑