30-дневная скользящая сумма с использованием предложения OVER в SQL Server 2012
Я пытаюсь написать представление в SQL Server 2012, где я рассчитываю 30-дневную скользящую сумму для набора транзакций.
Текущий скрипт:
SELECT CustNo, TransactionDate, TransactionAmount, SUM(TransactionAmount)
OVER (PARTITION BY CustNo ORDER BY TransactionDate) AS MovingAmount
FROM dbo.TransactionData
Набор данных:
CustNo TransactionDate TransactionAmount
1111 5/7/2015 3,000
1111 5/14/2015 3,000
2222 5/17/2015 100
1111 5/21/2015 3,000
1111 5/28/2015 3,000
3333 5/31/2015 11,000
1111 6/10/2015 3,000
Ожидаемый результат:
CustNo TransactionDate TransactionAmount MovingAmount
1111 5/7/2015 3,000 12,000
1111 5/14/2015 3,000 12,000
2222 5/17/2015 100 100
1111 5/21/2015 3,000 9,000
1111 5/28/2015 3,000 6,000
3333 5/31/2015 11,000 11,000
1111 6/10/2015 3,000 3,000
Другие попытки:
SELECT CustNo, TransactionDate, TransactionAmount, SUM(TransactionAmount)
OVER (PARTITION BY CustomerNumber ORDER BY TransactionDate,
BETWEEN TransactionDate AND DATEADD(day, 30, TransactionDate))
AS MovingAmount
FROM dbo.TransactionData
1 ответ
Я предполагаю, что 12 000 в первом ряду желаемого результата - опечатка, и это должно быть 3000. Если я прав, ваш первый запрос, кажется, работает нормально, просто трудно увидеть без order by
на весь запрос:
Создайте и заполните образец таблицы (пожалуйста, сохраните этот шаг в ваших будущих вопросах)
CREATE TABLE TransactionData
(
CustNo int,
TransactionDate date,
TransactionAmount int
)
INSERT INTO TransactionData(CustNo, TransactionDate, TransactionAmount) VALUES
(1111, '2015-05-07', 3000),
(1111, '2015-05-14', 3000),
(2222, '2015-05-17', 100),
(1111, '2015-05-21', 3000),
(1111, '2015-05-28', 3000),
(3333, '2015-05-31', 11000),
(1111, '2015-06-10', 3000)
Продолжая интерпретацию вопроса с помощью Tab Alleman, это нельзя сделать с помощью предложения over, вам нужно использовать коррелированный подзапрос:
SELECT CustNo,
TransactionDate,
TransactionAmount,
(SELECT SUM(TransactionAmount)
FROM dbo.TransactionData t1
WHERE t1.CustNo = t0.CustNo
AND t1.TransactionDate >= t0.TransactionDate
AND t1.TransactionDate <= DATEADD(DAY, 30, t0.TransactionDate)) As MovingAmount
FROM dbo.TransactionData t0
ORDER BY CustNo, TransactionDate
Результаты:
CustNo TransactionDate TransactionAmount MovingAmount
1111 07.05.2015 00:00:00 3000 12000
1111 14.05.2015 00:00:00 3000 12000
1111 21.05.2015 00:00:00 3000 9000
1111 28.05.2015 00:00:00 3000 6000
1111 10.06.2015 00:00:00 3000 3000
2222 17.05.2015 00:00:00 100 100
3333 31.05.2015 00:00:00 11000 11000