【问题标题】:Return value in Access queryAccess 查询中的返回值
【发布时间】:2021-07-07 02:52:49
【问题描述】:

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

Select customerid, count(*), cusname,orderdate,orderstatus
From tablename
Where orderstatus="active"
Group by customerid,cusname,orderdate,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

【问题讨论】:

    标签: sql ms-access ms-access-2016


    【解决方案1】:

    这在 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", -14, date())
               );
    

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

    【讨论】:

    • 谢谢。我只是想确定一下,因为访问就像你说的那样棘手。使用 TOP 是我能够在 14 天内显示与活动状态相关的日期的唯一方法吗?
    • @Neptune12 。 . .我错过了 14 天条件,所以我将其添加到查询中。
    【解决方案2】:
    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
    

    【讨论】:

    • 谢谢,但你的和我的差不多。我测试了你的,它也不能在访问中工作。另外,由于聚合,我必须在 group by 中添加 orderdate、orderstatus。
    • 如果您需要这样的GROUP BY,那么可以将该查询用作WHERE 子句中的子查询作为customer_ids 的来源:SELECT * FROM &lt;tablename&gt; WHERE customer_id IN (&lt;query&gt;) GROUP BY &lt;anything&gt;
    【解决方案3】:

    试试这个

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

    【讨论】:

      猜你喜欢
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多