如何将赤字值自动化到下个月的目标?
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 [重复]