如何将赤字值自动化到下个月的目标?

Posted

技术标签:

【中文标题】如何将赤字值自动化到下个月的目标?【英文标题】:How to Automate Deficit Value to Next Month Target? 【发布时间】:2021-10-16 14:20:50 【问题描述】:

我有一个如下图的数据表

Owner Month Year Target Achieved
A April 2021 100 50
B April 2021 100 80
A May 2021 100 80
B May 2021 100 130
A June 2021 100 50
B June 2021 100 60

逻辑是,如果在已实现方面存在短缺,则应将短缺量添加到下个月的目标中。

例如,A 的 4 月目标是 100,已实现是 50。差额将是 100-50=50。 50 应该添加到 May Target

所需的输出为

Owner Month Year Target Achieved Shortfall(Target-Achieved)
A April 2021 100 50 50
A May 2021 150 80 70
A June 2021 170 50 120
B April 2021 100 80 20
A May 2021 120 130 -10
B June 2021 100 60 40

是否有可能在 SQL 中实现这种自动化?

谢谢

【问题讨论】:

嗨@user12490809 你使用哪个mysql版本?如果空头下跌,那么它会增加下个月的目标吗? 您好,我使用的是 8.0 版本 【参考方案1】:

如果数据可用,请考虑按年按月作为订购目的。如果先前的空头跌幅为负,则当前行空头跌幅将被计算为目标 - 已实现,否则为目标 + prev.shortfall - 已实现。

-- MySQL(v5.8)
SELECT t.owner, t.month, t.year
     , t.target + (CASE WHEN t.row_num = 1 THEN 0
                        ELSE CASE WHEN LAG(short_fall) OVER (PARTITION BY t.owner ORDER BY t.row_num) < 0
                                     THEN 0
                                  ELSE LAG(short_fall) OVER (PARTITION BY t.owner ORDER BY t.row_num)
                             END 
                   END) target
      , t.achieved
      , CASE WHEN LAG(short_fall) OVER (PARTITION BY t.owner ORDER BY t.row_num) < 0
                THEN t.target - t.achieved
             ELSE short_fall
        END short_fall
FROM (select owner, month
     , year
     , target
     , achieved
     , SUm(target - achieved) OVER 
           (PARTITION BY owner, year ORDER BY DATE_FORMAT(STR_TO_DATE(CONCAT(month, ' 1, ', year),'%M %d,%Y'), '%c')) short_fall                                                   
     , ROW_NUMBER() OVER 
           (PARTITION BY owner, year ORDER BY DATE_FORMAT(STR_TO_DATE(CONCAT(month, ' 1, ', year),'%M %d,%Y'), '%c')) row_num
from test) t;

请查看网址https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=3e114348c2d92015490f76fdbab1c46f

【讨论】:

嗨@user12490809 请检查我的回答,如果有任何问题,请告诉我。 嗨@user12490809 你得到你预期的答案了吗?每个人都试图回答所提出的问题以提供帮助。尝试提出您的宝贵意见。【参考方案2】:

你想要一个累积的总和。假设month列确实是有序的,那么最后一列是:

select t.*,
       sum(target - achieved) over (partition by owner, year
                                    order by month
                                   )
from t;

您可以使用它来计算新目标:

select t.*,
       sum(target - achieved) over (partition by owner, year
                                    order by month
                                   )
       (achieved +
        sum(target - achieved) over (partition by owner, year
                                     order by month
                                    )
       ) as new_target
from t;

【讨论】:

以上是关于如何将赤字值自动化到下个月的目标?的主要内容,如果未能解决你的问题,请参考以下文章

获取从当前日期到下一个完整月的记录(直到下个月的最后一个日期)mysql [重复]

如何在liquibase中设置当月第一个日期和下个月的默认值?

在EXCEL中,今天到下个月今天的天数怎么计算,求教了

java如何实现在下个月的某一天自动获取某数据

获取下个月的今天

MySQL怎么查询每个月有多少天 详情如下: