mysql - 如何根据上个月的计算更新每个月的期初余额?

标签 mysql sql date formula

我实际上是在尝试用 SQL 计算滚动总计。我每个月都有一些不同的总计(费用、付款、调整、坏账),需要从上个月的期末余额中减去这些总和。 5 月份,期末余额为 28,814,788 美元。根据 6 月份的总和(总计 1,030,927 美元),6 月份的期末余额现在应为 27,783,862 美元(28,814,788 美元 - 830,998 美元)。这 27,783,862 美元现在应该是 7 月份的期初余额。

我编写了以下代码。 SELECT 子句中的子查询提供了 5 月的未结余额(期末余额 $28,814,788)应该从 6 月的总额中减去。

SELECT  
    CASE    WHEN POST_DATE BETWEEN '2019-08-01' AND '2019-08-31' THEN 'August - 2019'
            WHEN POST_DATE BETWEEN '2019-07-01' AND '2019-07-31' THEN 'July - 2019'
            WHEN POST_DATE BETWEEN '2019-06-01' AND '2019-06-30' THEN 'June - 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 begin_bal,
        sum(CHARGE_AMOUNT)+sum(VOID_AMOUNT) as charge_tot, 
        sum(PAYMENT_AMOUNT) as payment_tot,
        sum(ADJUSTMENT_AMOUNT) as adjust_tot,
        sum(ACTIVE_AR_IN_OUT) as bad_debt
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-08-01' AND '2019-08-31' THEN 'August - 2019'
            WHEN POST_DATE BETWEEN '2019-07-01' AND '2019-07-31' THEN 'July - 2019'
            WHEN POST_DATE BETWEEN '2019-06-01' AND '2019-06-30' THEN 'June - 2019'
            ELSE 'Other' END

预期结果为:DESIRED OUTPUT

最佳答案

所以,我实际上找到了我自己问题的答案。我走了几步。

首先,我决定通过添加一列来反射(reflect)费用、付款、调整和 bad_debt 的总和来稍微组织一下。这在以后的总计中会派上用场。感觉有点“hacky”,但我只是在学习,所以无论如何。

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

第三,这让我可以在我的总计表达式中专门引用“month_year”:

 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

最后,我实际上需要从前几个月的运行总计中减去运行(总和)而不是运行总计(即“beginning_balance”减去“sum_of_values”),为此我只是修改了上面的表达式:

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 

Final Output

关于mysql - 如何根据上个月的计算更新每个月的期初余额?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58329919/

相关文章:

MySQL 家庭 : Group Duplicate Addresses And Update Names to Include Both People

sql - 数据库占用的空间比表的总和还要多

mysql - SQL中玩家得分表的结构

php - 这是真实的约会吗

java - 带 am/pm 的日期对象的格式

javascript - JSON 的频率分布

mysql - 如何生成随机字符并使用 MySQL 插入?

MySQL多表访问查询

mysql - 如何在 AWS glue 中处理 '0000-00-00' - pyspark

php - 如果 columnName = float,则返回空结果集