过去3年未使用的客户的SQL查询

时间:2014-05-01 19:06:17

标签: sql ms-access

认为我遇到了麻烦。

我试图在过去3年内在桌面上使用过的客户查询2个表格。这些数据包含7年以上的数据,因此客户可以多次使用。

我认为我当前查询存在的问题是:它查找过去3年未使用过的客户数据......但是并不能说明客户是否还有数据。过去3年也是如此。

有人可以帮助我吗?我猜测答案是只使用最新日期的客户数据并忽略以前的数据。

SELECT DISTINCT 
    tbl_Customer.CustomerID
    , tbl_Customer.CustomerName
    , Table1.ImportDate
    , Table2.ImportDate
FROM 
    tbl_Customer 
LEFT JOIN 
    Table1 ON tbl_Customer.CustomerName = Table1.CustomerName 
LEFT JOIN 
    Table2 ON tbl_Customer.CustomerName = Table2.CustomerName
WHERE 
    (((DateAdd("yyyy", 3, [Table2].[ImportDate])) < Now()) 
AND 
    ((DateAdd("yyyy", 3, [Table1].[ImportDate])) < Now()))
ORDER BY 
    Table1.ImportDate DESC, 
    Table2.ImportDate DESC;

3 个答案:

答案 0 :(得分:1)

初始查询的核心问题是,对于没有导入(对于“无订单”客户而言),条件

    DateAdd("yyyy", 3, ImportDate) < Now()
--> DateAdd("yyyy", 3, NULL) < Now()
--> NULL < Now()
--> NULL (or not true)

不是真的。一个简单的解决方法是添加一个后卫

([Table1].[ImportDate] IS NULL
 OR DateAdd("yyyy", 3, [Table1].[ImportDate]) < Now())

围绕这些表达式或在使用之前合并NULL值。

排序也是错误的,因为这意味着按一个值排序,然后然后另一个,而不是“两者中的较大值”。与

比较
ORDER BY
IIF(Table1.ImportDate > Table2.ImportDate, Table1.ImportDate, Table2.ImportDate)

但是,我会在客户/订单上使用LEFT JOIN,在订单日期使用带有MAX的GROUP BY。然后你可以使用那个结果(作为派生子查询)来完成相当简单的查询。

SELECT
    c.CustomerID
  , MAX(o.ImportDate) as lastImport
FROM tbl_Customer as c
-- The UNION is to simply "normalize" to a single table.
-- (Also, shouldn't the join be on a customer "ID"?)
LEFT JOIN (
        SELECT CustomerName, ImportDate from Table1
        UNION
        SELECT CustomerName, ImportDate from Table2) as o
    ON c.CustomerName = o.CustomerName
GROUP BY c.CustomerID

然后,

SELECT s.CustomerID
FROM (thatSubQuery) as s
WHERE
    -- no orders
    s.lastImport IS NULL
    -- only old orders
 OR DateAdd("yyyy", 3, s.lastImport) < Now()
ORDER BY s.lastImport

(具有MS Access的YMMV,这将在“真实”数据库中工作; - )

答案 1 :(得分:0)

SELECT DISTINCT 
    tbl_Customer.CustomerID, 
    tbl_Customer.CustomerName, 
    Table1.ImportDate, 
    Table2.ImportDate
FROM (tbl_Customer 
LEFT JOIN Table1 
    ON tbl_Customer.CustomerName = Table1.CustomerName) 
LEFT JOIN Table2 
    ON tbl_Customer.CustomerName = Table2.CustomerName
WHERE DateAdd("yyyy",3,[Table2].[ImportDate]) < Now() 
AND DateAdd("yyyy",3,[Table1].[ImportDate]) < Now() 
AND tbl_Customer.CustomerID NOT IN (
    SELECT DISTINCT 
        tbl_Customer.CustomerID, 
    FROM (tbl_Customer 
    LEFT JOIN Table1 
        ON tbl_Customer.CustomerName = Table1.CustomerName) 
    LEFT JOIN Table2 
        ON tbl_Customer.CustomerName = Table2.CustomerName
    WHERE DateAdd("yyyy",3,[Table2].[ImportDate]) >= Now() 
    AND DateAdd("yyyy",3,[Table1].[ImportDate]) >= Now() 
)
ORDER BY Table1.ImportDate DESC , Table2.ImportDate DESC;

答案 2 :(得分:0)

根据我从您的查询中可以推断出的有关您的数据结构的内容,我认为您需要这样的内容:

DECLARE @CutOff DateTime
SET @CutOff = DATEADD(y, -3 GETDATE())

SELECT tbl_Customer.CustomerID, tbl_Customer.CustomerName
WHERE (CustomerName IN 
    (SELECT CustomerName FROM Table1 WHERE ImportDate < @CutOff))
    OR 
    (CustomerName IN 
    (SELECT CustomerName FROM Table2 WHERE ImportDate < @CutOff)))
    AND CustomerName NOT IN
    (SELECT CustomerName FROM Table1 WHERE ImportDate > @CutOff)
    AND CustomerName NOT IN
    (SELECT CustomerName FROM Table2 WHERE ImportDate > @CutOff)