Получить последовательную сумму в ORACLE 11.2

У меня есть таблица, которая содержит некоторые (положительные) числовые значения в 2 столбцах, один для положительных и один для отрицательных значений.

тестовая_таблица

POSITIVEVALUE | NEGATIVEVALUE
----------------------------------
100 
              | 50
70            |
              | 80
100           | 30

Мне нужно получить последовательную сумму суммы строк в каждой строке. Я пробовал кое-что с помощью LAG(), что приводит к следующему результату.

Запрос:

SELECT PositiveValue,
       NegativeValue, 
       RowTotal,
       NVL( (LAG(RowTotal, 1, NULL) OVER (ORDER BY ROWNUM)), 0) AS LagValue, 
       ( NVL( (LAG(RowTotal, 1, NULL) OVER (ORDER BY ROWNUM)), 0)
          + (NVL(RowTotal, 0))) AS SuccessiveSum
FROM(
     SELECT PositiveValue,
            NegativeValue, 
            NVL(PositiveValue, 0) - NVL(NegativeValue, 0) AS RowTotal
      FROM test_table);

Результат:

POSITIVEVALUE   NEGATIVEVALUE   ROWTOTAL    LAGVALUE    SUCCESSIVESUM
100                             100         0           100
                50              -50         100         50
70                              70          -50         20
                80              -80         70          -10
100             30              70          -80         -10

Как получить результат в виде суммы суммы строк с предыдущей суммой строк, как показано ниже?

ROWTOTAL    SUCCESSIVESUM
100         100
-50         50
70          120
-80         40
70          110

person Waliul Islam    schedule 17.11.2015    source источник
comment
Все это время я получал решение своих проблем от старых вопросов. Но на этот раз мне пришлось спросить об этом, потому что все, что я нашел в Google, это Ряд Фибоначчи.   -  person Waliul Islam    schedule 17.11.2015


Ответы (2)


Просто простая аналитическая сумма?

WITH data (POSITIVEVALUE, NEGATIVEVALUE) AS (
    SELECT  100, NULL FROM DUAL UNION ALL
    SELECT NULL,   50 FROM DUAL UNION ALL
    SELECT   70, NULL FROM DUAL UNION ALL
    SELECT NULL,   80 FROM DUAL UNION ALL
    SELECT  100,   30 FROM DUAL
)
SELECT
    ROWTOTAL,
    SUM(ROWTOTAL) OVER (ORDER BY RN) SUCCESSIVESUM
FROM (
    SELECT
        ROWNUM RN,
        NVL(POSITIVEVALUE, 0) - NVL(NEGATIVEVALUE, 0) ROWTOTAL
    FROM
        data)
person Husqvik    schedule 17.11.2015
comment
Спасибо. SUM() OVER() дал мне именно то, что я хотел. - person Waliul Islam; 17.11.2015

person    schedule
comment
Это не решение моей проблемы @Avrajit. - person Waliul Islam; 17.11.2015
comment
Эй, извинения за неудобства. Я опубликовал исправленный ответ. Можете ли вы проверить, пожалуйста, если это поможет. - person Avrajit Roy; 17.11.2015