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

Вы можете увидеть живое демо на rextester.

Другие вопросы по тегам