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



对于一个学校项目,我试图用SQL编写一个查询,以检查订单表是否有任何买家在72小时内花费了超过15.000美元。

所以我的数据库包含一个订单表,每个订单都包含一个唯一的买家名称,订单日期(OrderCreatedOn(和订单价格(金额(。使用我的 SQL 查询,当单个客户在 72 小时内的订单总和超过 15.000 美元时,我试图触发警报。

我想出了以下查询:

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条款无法正常工作,它只是返回 SUM 超过 15.000 的所有订单,我不知道如何解决它。

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

Where子句在这里似乎有问题

WHERE OrderCreatedOn BETWEEN OrderCreatedOn AND DateADD(Hour, - 72 , 
GETDATE())

上述子句将始终为真,因为OrderCreatedOn将始终等于between的第一部分(再次OrderCreatedOn(。

您应该将where子句修改为-

WHERE OrderCreatedOn >= DateADD(Hour, - 72 , GETDATE())

此外,如果同一买家在 72 小时内有多个订单,您的查询可能不起作用,因为您在group byselect中有OrderCreatedOn列,它将始终返回带有买家和订单日期组合的唯一记录。Sum仅适用于该订单。此外,您希望在列上使用聚合函数Amount因此它不应该是"分组依据"的一部分。因此,您应该从Group by中删除OrderCreatedOn&Amount,这将在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

您可以使用表表达式计算每一行的 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

最新更新