SQL-запрос, возвращающий клиентов, которые потратили более $ 15.000 за промежуток времени в 72 часа - PullRequest
0 голосов
/ 05 октября 2018

Для школьного проекта я пытаюсь написать запрос на SQL, который проверяет таблицу заказов, если были какие-либо покупатели, которые потратили более $ 15.000 за промежуток времени в 72 часа.

Итак, моя база данных содержит таблицу заказов, каждый заказ содержит уникальное имя покупателя, дату заказа (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 не работает должным образом, оно просто возвращает все заказы, где сумма превышает 15.000, и я не могу понять, как ее решить.

Любая помощь будет принята с благодарностью :), спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Предложение Where здесь, похоже, является проблемой

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

Вышеупомянутое предложение будет всегда верно, так как OrderCreatedOn будет равен первой части between (снова OrderCreatedOn)всегда.

Вы должны изменить предложение where как-

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

Также ваш запрос может не работать, если один и тот же покупатель имеет несколько заказов в течение 72 часов, поскольку у вас есть столбец OrderCreatedOnв group by и select он всегда будет возвращать уникальные записи с комбинацией покупателя и даты заказа.Sum будет применяться только к этому заказу.Также вы хотите использовать агрегатную функцию в столбце Amount, поэтому она не должна быть частью group by.Таким образом, вы должны удалить OrderCreatedOn & Amount из Group by, что сгруппирует все заказы, сделанные покупателем за 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
0 голосов
/ 05 октября 2018

Вы можете использовать табличное выражение, чтобы вычислить для каждой строки его накопленные за 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
...