Sql 如何选择在过去7天内未下订单的客户

Sql 如何选择在过去7天内未下订单的客户,sql,firebird,Sql,Firebird,我想找出过去七天内没有下订单的客户。基本上我有三张桌子:客户、订单和服务台代理 我想找出获取这些信息的最佳方法 SQL bellow检索客户信息、服务台代理111和每个客户订单的最后日期: SELECT DISTINCT customers.customer_id, customers.customer_name, agents.help_desk_agent, Max(orders.order

我想找出过去七天内没有下订单的客户。基本上我有三张桌子:客户、订单和服务台代理

我想找出获取这些信息的最佳方法

SQL bellow检索客户信息、服务台代理111和每个客户订单的最后日期:

SELECT DISTINCT customers.customer_id, 
                customers.customer_name, 
                agents.help_desk_agent, 
                Max(orders.order_date) 
FROM   customers 
       LEFT JOIN (SELECT DISTINCT customers.customer_id, 
                                  orders.order_date 
                  FROM   orders 
                  GROUP  BY 1, 
                            2) orders2 
              ON customers.customer_id = orders2.customer_id 
       LEFT JOIN help_desk_agents 
              ON customers.help_desk_agent_id = 
                 help_desk_agents.help_desk_agent_id 
WHERE  customer.help_desk_agent_id = 111 
GROUP  BY 1, 
          2, 
          3 

我想以某种方式筛选过去七天内未下订单的客户。

尝试在查询的和处添加以下内容:

having max(orders.order_date) < dateadd(day, -7, getdate())

尝试在查询的和处添加以下内容:

having max(orders.order_date) < dateadd(day, -7, getdate())
你可以试试看

Datediff(dd,<datecolumn>,getdate())

作为条件。

您可以尝试

Datediff(dd,<datecolumn>,getdate())


作为一个条件。

您想要的查询应该如下所示:

SELECT c.customer_id, c.customer_name, a.help_desk_agent, 
                Max(orders.order_date) 
FROM customers c JOIN
     (SELECT o.customer_id, MAX(o.order_date) as max_order_date
      FROM orders o
      GROUP BY o.customer_id
     ) o 
     ON c.customer_id = o.customer_id 
WHERE c.help_desk_agent_id = 111 AND
      o.max_order_date < dateadd(day, -7, getdate());
您的查询存在多个问题:

子查询中不理解别名customers.customer\u id。 不需要使用select distinct。 左联接是不必要的,因为假定客户至少有一个订单,并且您需要与代理表匹配。 您不需要agent表,因为您需要的信息在customer表中。
所需的查询应如下所示:

SELECT c.customer_id, c.customer_name, a.help_desk_agent, 
                Max(orders.order_date) 
FROM customers c JOIN
     (SELECT o.customer_id, MAX(o.order_date) as max_order_date
      FROM orders o
      GROUP BY o.customer_id
     ) o 
     ON c.customer_id = o.customer_id 
WHERE c.help_desk_agent_id = 111 AND
      o.max_order_date < dateadd(day, -7, getdate());
您的查询存在多个问题:

子查询中不理解别名customers.customer\u id。 不需要使用select distinct。 左联接是不必要的,因为假定客户至少有一个订单,并且您需要与代理表匹配。 您不需要agent表,因为您需要的信息在customer表中。
您能给我们展示一下您的表结构吗?您能给我们展示一下您的表结构吗?虽然这肯定会起作用,但它会在分组结果的每一行上执行Datediff函数。Dragan的答案是每行只执行一次dateadd。从性能角度来看,我同意。我的错。谢谢你给我的小费!虽然这肯定会起作用,但它会对分组结果的每一行执行Datediff函数。Dragan的答案是每行只执行一次dateadd。从性能角度来看,我同意。我的错。谢谢你给我的小费!嗨,德拉根,我得到了预期的结果。谢谢!嗨,德拉根,我得到了预期的结果。谢谢!