Как я могу обновить начальный баланс для каждого месяца на основе расчета предыдущего месяца? - PullRequest
1 голос
/ 10 октября 2019

Я, по сути, пытаюсь вычислить скользящие итоги в SQL. У меня есть несколько разных итогов (сборы, платежи, корректировки, безнадежные долги) за каждый месяц, чья сумма должна быть вычтена из конечного баланса предыдущего месяца. В мае конечное сальдо составило 28 814 788 долларов. С учетом суммы итогов за июнь (всего 1 030 927 долл. США) конечное сальдо в июне должно составить 27 783 862 долл. США (28 814 788 долл. США - 830 998 долл. США). Эти 27 783 862 долл. США должны стать начальным балансом июля.

Я написал следующий код. Подзапрос в предложении SELECT предоставляет непогашенный остаток за май (конечный остаток, $ 28 814 788), который должен быть вычтен из итогов за июнь. *

1 Ответ

0 голосов
/ 14 октября 2019

Итак, я действительно нашел ответ на свой вопрос. Я сделал несколько шагов.

Сначала я решил немного упорядочить вещи, добавив столбец, отражающий сумму сборов, платежей, корректировок и bad_debt. Это пригодится позже для подведения итогов. Это казалось немного "хакерским", но я только учусь, ну и что угодно.

sum(CHARGE_AMOUNT)+sum(VOID_AMOUNT)+sum(PAYMENT_AMOUNT)+
    sum(ADJUSTMENT_AMOUNT)+sum(ACTIVE_AR_IN_OUT) as sum_of_values 

Во-вторых, я создал промежуточный итог. Изначально это была сложная задача, потому что я не мог ссылаться на месяц и год, если не указывал псевдоним как month_year и не помещал его в подзапрос в предложении FROM.

FROM 
    (SELECT 
CASE    WHEN POST_DATE BETWEEN '2019-06-01' AND '2019-06-30' THEN 'June - 2019'
        WHEN POST_DATE BETWEEN '2019-07-01' AND '2019-07-31' THEN 'July - 2019'
        WHEN POST_DATE BETWEEN '2019-08-01' AND '2019-08-31' THEN 'August - 2019'
        ELSE 'Other' END as month_year,
        (SELECT sum(OUTSTANDING_AMT)
    FROM ARPB_TRANSACTIONS
    WHERE POST_DATE BETWEEN '2019-05-01' AND '2019-05-31') as beginning_balance,
    sum(CHARGE_AMOUNT)+sum(VOID_AMOUNT) as charge_tot, 
    sum(PAYMENT_AMOUNT) as payment_tot,
    sum(ADJUSTMENT_AMOUNT) as adjustment_tot,
    sum(ACTIVE_AR_IN_OUT) as bad_debt_tot,
    sum(CHARGE_AMOUNT)+sum(VOID_AMOUNT)+sum(PAYMENT_AMOUNT)+
    sum(ADJUSTMENT_AMOUNT)+sum(ACTIVE_AR_IN_OUT) as sum_of_values 
FROM F_ARPB_CUBE_ETR_DETAIL 
WHERE POST_DATE BETWEEN '2019-06-01' AND '2019-08-31'
GROUP BY CASE   
    WHEN POST_DATE BETWEEN '2019-06-01' AND '2019-06-30' THEN 'June - 2019'
    WHEN POST_DATE BETWEEN '2019-07-01' AND '2019-07-31' THEN 'July - 2019'
    WHEN POST_DATE BETWEEN '2019-08-01' AND '2019-08-31' THEN 'August - 2019'
    ELSE 'Other' END ) as x

В-третьих, тогда это позволило мне конкретно указать «месяц_год» в моем выражении итоговой суммы:

 SELECT month_year, beginning_balance,charge_tot, payment_tot, adjustment_tot, bad_debt_tot, sum_of_values, SUM(sum_of_values) OVER (ORDER BY month_year desc) as running_total

Последнее, вместо текущего (итогового) итога, мне действительно нужнотекущее вычитание из промежуточных итогов за предыдущие месяцы (то есть, «начальный_баланс» за вычетом «сумма_значений»), поэтому для этого я просто изменил приведенное выше выражение следующим образом:

SELECT  month_year, beginning_balance,charge_tot, payment_tot, adjustment_tot, bad_debt_tot, sum_of_values, beginning_balance-SUM(sum_of_values) OVER (ORDER BY month_year desc) as running_total

Итак, вот последний запрос:

SELECT  month_year, beginning_balance,charge_tot, payment_tot, adjustment_tot, bad_debt_tot, sum_of_values, beginning_balance-SUM(sum_of_values) OVER (ORDER BY month_year desc) as running_total
FROM 
    (SELECT 
CASE    WHEN POST_DATE BETWEEN '2019-06-01' AND '2019-06-30' THEN 'June - 2019'
        WHEN POST_DATE BETWEEN '2019-07-01' AND '2019-07-31' THEN 'July - 2019'
        WHEN POST_DATE BETWEEN '2019-08-01' AND '2019-08-31' THEN 'August - 2019'
        ELSE 'Other' END as month_year,
        (SELECT sum(OUTSTANDING_AMT)
    FROM ARPB_TRANSACTIONS
    WHERE POST_DATE BETWEEN '2019-05-01' AND '2019-05-31') as beginning_balance,
    sum(CHARGE_AMOUNT)+sum(VOID_AMOUNT) as charge_tot, 
    sum(PAYMENT_AMOUNT) as payment_tot,
    sum(ADJUSTMENT_AMOUNT) as adjustment_tot,
    sum(ACTIVE_AR_IN_OUT) as bad_debt_tot,
    sum(CHARGE_AMOUNT)+sum(VOID_AMOUNT)+sum(PAYMENT_AMOUNT)+
    sum(ADJUSTMENT_AMOUNT)+sum(ACTIVE_AR_IN_OUT) as sum_of_values 
FROM F_ARPB_CUBE_ETR_DETAIL 
WHERE POST_DATE BETWEEN '2019-06-01' AND '2019-08-31'
GROUP BY CASE   
    WHEN POST_DATE BETWEEN '2019-06-01' AND '2019-06-30' THEN 'June - 2019'
    WHEN POST_DATE BETWEEN '2019-07-01' AND '2019-07-31' THEN 'July - 2019'
    WHEN POST_DATE BETWEEN '2019-08-01' AND '2019-08-31' THEN 'August - 2019'
    ELSE 'Other' END ) as x
ORDER BY month_year desc 

Конечный выход

...