SQL YTD для каждого месяца в году - PullRequest
0 голосов
/ 09 мая 2018

У меня есть следующая таблица:

oDate        oValue
----------------------------
2017-01-01   40
2017-02-01   50
2017-03-01   60
2017-04-01   10

Данные только один на каждый месяц.
Тогда я хочу получить следующий результат:

oDate        oValue         YTD
----------------------------------------
2017-01-01   40             40
2017-02-01   50             90
2017-03-01   60             150
2017-04-01   10             160

Таким образом, значение YTD представляет собой сумму oValue по сравнению с предыдущим месяцем и заканчивается в декабре выбранного года. Когда начнется новый Year, он снова будет рассчитываться, игнорируя предыдущий год.

У кого-нибудь есть идея для этого?
Спасибо.

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Просто используйте функциональность бегущей суммы:

select odate, ovalue,
       sum(ovalue) over (partition by year(odate) order by odate) as ytd
from t;

Это оконная функция. partition by перезапускает сумму каждый год. order by делает накопленную сумму в течение года.

0 голосов
/ 09 мая 2018

Один вариант использует коррелированный подзапрос, чтобы найти совокупный итог:

SELECT
    t1.oDate,
    t1.oValue,
    (SELECT SUM(t2.oValue) FROM yourTable t2
     WHERE t2.oDate <= t1.oDate AND YEAR(t1.oDate) = YEAR(t2.oDate)) AS YTD
FROM yourTable t1
ORDER BY t1.oDate;

enter image description here

Демо

...