2015-04-28 2 views
0

Я вытягиваю общие остатки на счетах для разных дат и вам нужно рассчитать разницу между этими суммарными остатками на счете, но нужно решение.Как рассчитать разницу между значениями SUM

SQL:

SELECT SNAPSHOT_DATE, 
SUM(ACCOUNT_BALANCE_AMOUNT) SAVINGS_BALANCES 
FROM pIDWUserVW.PRODUCT_SAVINGS_VW 
WHERE SNAPSHOT_DATE IN ('2015-01-02', '2015-01-30', '2015-02-02', '2015-02-27', '2015-03-31') 
GROUP BY SNAPSHOT_DATE 
ORDER BY SNAPSHOT_DATE ASC; 

Результаты:

SNAPSHOT_DATE SAVINGS_BALANCES 
1/2/2015 10,407,069,092.55 
1/30/2015 10,581,034,604.38 
2/2/2015 10,525,024,786.77 
2/27/2015 11,105,597,533.96 
3/31/2015 11,371,511,747.20 

Вот что я хочу (колонка "разница"), но я не могу найти правильную функцию, чтобы сделать это:

SNAPSHOT_DATE SAVINGS_BALANCES DIFFERENCE 
1/2/2015 10,407,069,092.55 
1/30/2015 10,581,034,604.38 173,965,511.83 
2/2/2015 10,525,024,786.77 (56,009,817.61) 
2/27/2015 11,105,597,533.96 580,572,747.19 
3/31/2015 11,371,511,747.20 265,914,213.24 

Я использую Teradata SQL Assistant и получаю такие ошибки, как Агрегаты разрешены только с функциями окна, когда я пытаюсь использовать такие функции, как MDIFF, но я мог бы сделать это неправильно.

+0

искать способ, чтобы сделать автообъединение на номерах строк или независимо от того, что позволяет терадата. –

ответ

1

Оконных агрегатная функция вычисляется после агрегации, вам необходима LEAD функции, которая не реализована в Teradata, но может легко эмулировать:

SELECT SNAPSHOT_DATE, 
    SUM(ACCOUNT_BALANCE_AMOUNT) SAVINGS_BALANCES, 
    SUM(ACCOUNT_BALANCE_AMOUNT)  -- current value 
    - MIN(SUM(ACCOUNT_BALANCE_AMOUNT)) -- previous row's value 
    OVER (ORDER BY SNAPSHOT_DATE 
      ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS DIFFERENCE 
FROM pIDWUserVW.PRODUCT_SAVINGS_VW 
WHERE SNAPSHOT_DATE IN ('2015-01-02', '2015-01-30', '2015-02-02', '2015-02-27', '2015-03-31') 
GROUP BY SNAPSHOT_DATE 
ORDER BY SNAPSHOT_DATE ASC; 
+0

Это сработало красиво! Огромное спасибо. –

Смежные вопросы