多个日期范围不同的行 - 排除逻辑

时间:2017-04-29 01:26:48

标签: sql-server

我需要找到客户被认为是"高级客户"时没有发生的客户交易。在此示例中,sql检索第2行。如何避免检索任何记录,因为此客户在第1行中引用的购买日期是溢价。

SELECT 
FROM TblPremCus c INNER JOIN tblTrans t ON c.CustomerID = t.CustomerID
WHERE t.PurchaseDate NOT BETWEEN c.StartDate AND c.EndDate

数据:

**tblPremCus**
ROWID   CustomerID  StartDate   EndDate
 1       ABC123     1/1/2016    6/16/2016
 2       ABC123     9/3/2016    12/21/9999
**tblTrans**
TransID   CustomerID  PurchaseDate
T1           ABC123       6/1/16

预期结果:无

1 个答案:

答案 0 :(得分:0)

我的理解是,您希望获得交易日期不属于客户“溢价”日期之间的所有交易。

在这样的情况下,更容易找到属于这些范围之一的交易,并且与您开始时的更改很简单:

SELECT * FROM TblPremCus c 
INNER JOIN tblTrans t ON c.CustomerID = t.CustomerID 
WHERE t.PurchaseDate BETWEEN c.StartDate AND c.EndDate

我们已经看到使用NOT BETWEEN不足以清除不需要的交易,但现在我们知道我们不想要哪些交易,我们可以找到我们做的事情:简单地说,以上查询未返回的任何内容。

SELECT * from TblTrans 
WHERE TransID NOT IN (SELECT TransID FROM TblPremCus c 
  INNER JOIN tblTrans t ON c.CustomerID = t.CustomerID 
  WHERE t.PurchaseDate BETWEEN c.StartDate AND c.EndDate)