SQL 查询在 72 小时内花费超过 15.000 美元的回头客
SQL query returning customers which have spent over $15.000 in a timespan of 72 hours
对于一个学校项目,我正在尝试在 SQL 中编写一个查询,检查订单 table 是否有任何买家在 72 小时的时间跨度内花费超过 15.000 美元。
所以我的数据库包含一个订单table,每个订单包含一个唯一的买家名称、订单日期(OrderCreatedOn) 和订单价格(Amount)。当我的 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的订单,我不知道如何解决。
如有任何帮助,我们将不胜感激:),在此先致谢!
您可以使用 table 表达式计算每一行的 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
将始终等于 between
的第一部分(再次是 OrderCreatedOn
)。
您应该将 where
子句修改为-
WHERE OrderCreatedOn >= DateADD(Hour, - 72 , GETDATE())
此外,如果同一买家在 72 小时内有多个订单,您的查询可能无法正常工作,因为您在 group by
和 select
中有 OrderCreatedOn
列,它总是 return 具有买家和订单日期组合的独特记录。 Sum
将仅适用于该订单。您还想在 Amount
列上使用聚合函数,因此它不应该是 'group by' 的一部分。因此,您应该从 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
对于一个学校项目,我正在尝试在 SQL 中编写一个查询,检查订单 table 是否有任何买家在 72 小时的时间跨度内花费超过 15.000 美元。
所以我的数据库包含一个订单table,每个订单包含一个唯一的买家名称、订单日期(OrderCreatedOn) 和订单价格(Amount)。当我的 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的订单,我不知道如何解决。
如有任何帮助,我们将不胜感激:),在此先致谢!
您可以使用 table 表达式计算每一行的 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
将始终等于 between
的第一部分(再次是 OrderCreatedOn
)。
您应该将 where
子句修改为-
WHERE OrderCreatedOn >= DateADD(Hour, - 72 , GETDATE())
此外,如果同一买家在 72 小时内有多个订单,您的查询可能无法正常工作,因为您在 group by
和 select
中有 OrderCreatedOn
列,它总是 return 具有买家和订单日期组合的独特记录。 Sum
将仅适用于该订单。您还想在 Amount
列上使用聚合函数,因此它不应该是 'group by' 的一部分。因此,您应该从 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