SQL查询返回在72小时内花费超过15000美元的客户

SQL查询返回在72小时内花费超过15000美元的客户,sql,sql-server,sql-server-2017,Sql,Sql Server,Sql Server 2017,对于一个学校项目,我试图用SQL编写一个查询,检查orders表是否有买家在72小时的时间跨度内花费了超过15000美元 因此,我的数据库包含一个orders表,每个订单都包含一个唯一的buyername、订单日期(OrderCreatedOn)和订单价格(Amount)。使用我的SQL查询,我试图在72小时内单个客户的订单总额超过15000美元时触发警报 我提出了以下问题: SELECT Orders.BuyerName, SUM(Amount) AS Total_Amount, Orders

对于一个学校项目,我试图用SQL编写一个查询,检查orders表是否有买家在72小时的时间跨度内花费了超过15000美元

因此,我的数据库包含一个orders表,每个订单都包含一个唯一的buyername、订单日期(OrderCreatedOn)和订单价格(Amount)。使用我的SQL查询,我试图在72小时内单个客户的订单总额超过15000美元时触发警报

我提出了以下问题:

SELECT Orders.BuyerName, SUM(Amount) AS Total_Amount, Orders.OrderCreatedOn
FROM Orders 
WHERE OrderCreatedOn BETWEEN OrderCreatedOn AND DateADD(Hour, - 72 , 
GETDATE())
GROUP BY Orders.BuyerName, Orders.amount , Orders.OrderCreatedOn
HAVING SUM(Orders.Amount) > 15000
ORDER BY BuyerName DESC
但是好像
WHERE
子句没有正常工作,它只是返回了总数超过15000的所有订单,我不知道如何解决它


任何帮助都将不胜感激:),提前谢谢

您可以使用一个表表达式来计算每一行72小时的累计花费。然后,您可以对其进行查询以筛选所需的行:

select * from (
  select
      buyername,
      ordercreatedon,
      amount,
      (select sum(amount) from orders o2
         where o2.buyername = o.buyername 
           and o2.ordercreatedon between 
             dateadd(hour, -72, o.ordercreatedon) and o.ordercreatedon
      ) as acc
    from orders
  ) x
  where acc >= 15000

Where
子句似乎是这里的问题

WHERE OrderCreatedOn BETWEEN OrderCreatedOn AND DateADD(Hour, - 72 , 
GETDATE())
上述条款始终为真,因为
OrderCreatedOn
始终等于
之间的
的第一部分(
OrderCreatedOn

您应该将
where
子句修改为-

WHERE OrderCreatedOn >= DateADD(Hour, - 72 , GETDATE())
此外,如果同一买家在72小时内有多个订单,则您的查询可能不起作用,因为您在
group by
select
中有
OrderCreatedOn
列,它将始终返回买家和订单日期组合的唯一记录<代码>总和
仅适用于该订单。您还希望在
Amount
列上使用聚合函数,因此它不应该是“分组依据”的一部分。因此,您应该将
OrderCreatedOn
Amount
groupby
中删除,这将对买家在72小时内下的所有订单进行分组,并将所有订单的金额进行
Sum
。最后的查询如下所示-

SELECT Orders.BuyerName, SUM(Amount) AS Total_Amount
FROM Orders 
WHERE OrderCreatedOn >= DateADD(Hour, - 72 , GETDATE())
GROUP BY Orders.BuyerName 
HAVING SUM(Orders.Amount) > 15000
ORDER BY BuyerName DESC

在GETDATE()和DateADD(Hour,-72,GETDATE())之间的OrderCreatedOn的位置
你班上的其他人?在预期输出中,为什么有
OrderCreatedOn
?这是一等货吗?最后一个?如果买家出现2次(想想每天在6天内下单,连续3天加起来就超过了过滤后的数量),你就快到了。使用@PM77-1建议的方法,但不要忘记交换
getdate
dateadd
位置)实际上
>=dateadd(-72)
就足够了-不需要上限<代码>订单.amount,Orders.OrderCreatedOn
分组依据
列表中是不必要的-它们阻止了按
买方名称进行分组
。非常感谢您的时间和清除爆炸!我尝试了您的查询,但没有返回任何结果,我认为这可能是因为订单的最新日期是3个月前(从2018-07-13及更久)。因此,为了测试查询,我不得不使用旧数据。使用这些旧的日期是否有任何工作来测试查询?@ Brr KeHER替换<代码> GETDATE()/<代码> <代码> '2018—07—14 ' < /代码>?是的,正如@ MatBailie所说的,将GETDATE()替换为您想考虑的日期,如“2018—07—14”,我认为这个答案是错误的,因为它考虑了一个单一的时间范围。如果您需要了解何时达到阈值,则需要按行进行聚合。否决票。