Access 查询中的返回值

问题描述

我需要有关 Access 查询的帮助。我需要返回一个客户名称,该客户名称在截至今天的日期的过去 14 天内有三个或更多订单仍然有效。它还应该在结果中显示订单日期。这将填充在报告中并按“客户名称”分组并显示每个“订单日期”。我尝试使用查询向导并输入下面的 sql 但它没有填充任何结果。有人可以帮忙吗?

Select customerid,count(*),cusname,orderdate,orderstatus
From tablename
Where orderstatus="active"
Group by customerid,orderstatus
Having Count(*) >=3;

表格:

CusName:|orderdate:
Mary     4/4/2021
Mary     4/3/2021
Mary     4/8/2021
Mary     3/23/2021
Bob      4/9/2021
Bob      4/1/2021

我期望的结果是:

表格:

Customerid:|CusName:|orderdate:
1 Mary     4/4/2021
1 Mary     4/3/2021
1 Mary     4/8/2021

解决方法

这在 MS Access 中相当棘手,但您可以使用:

select t.*
from tablename as t
where t.orderstatus = "active" and
      t.orderdate in (select top 3 t2.orderdate
                      from tablename t2
                      where t2.customerid = t.customerid and
                            t2.orderstatus = "active" and
                            t2.orderdate > dateadd("day",-14,date())
                      order by t2.orderdate desc
                     ) and
      3 <= (select count(*)
            from tablename as t3
            where t3.customerid = t.customerid and
                  t3.orderstatus = "active" and
                  t3.orderdate > dateadd("day",date())
           );

第一个子查询为每个客户获取最近的三行。第二个检查至少有三个。

,
  1. 你也应该对日期进行过滤
  2. 如果您要计算“每个客户的唯一订单”而不是“每个客户每个日期的唯一订单”,您可能不应该按订单日期分组
SELECT customer_id,cusname,COUNT(*) 
  FROM <tablename> 
 WHERE ABS(DateDiff('d',order_date,NOW())) <= 14 -- check order date
   AND order_status = 'active'                     -- check order status
 GROUP BY customer_id,cusname                     -- group by customer,not by order
HAVING COUNT(*) >= 3                               -- filter customers with 3+ orders
,

试试这个

SELECT t.customerid,t.cusname,t.orderdate,t.orderstatus
FROM   tablename AS t
WHERE  t.orderstatus = "active"
       AND t.orderdate > Dateadd("d",DATE())
       AND (SELECT Count(t1.cusname)
            FROM   tablename AS t1
            WHERE  t.customerid = t1.customerid
                   AND t1.orderstatus = "active"
                   AND t1.orderdate > Dateadd("d",DATE())) >= 3