当月份采用宽格式时,计算过去 36 个月的平均值(无法更改此格式)

问题描述 投票:0回答:1

我有一个奇怪的 snowflake 表格格式,在仅显示过去 36 个月的数据时会导致问题。

换句话说,我想查看过去 36 个月的数据,因此在查看当前日期时,2021 年 5 月之前的所有数据都应显示为 0。

财政年度从 10 月开始,因此表格月份发生变化。

这些年比 2021 年还远,但我只想要最后 36 个月。

该平台是雪花脚本,但如果您有 sql 脚本,我也可以翻译为雪花。

如有任何建议,我们将不胜感激。

原始表我开始于:

账户 年份 十月 十一月 十二月 一月 二月 三月 四月 五月 六月 七月 八月 九月
A1 2021 1 2 3 4 5 6 44 55 66 77 88 99
A2 2022 1 2 3 4 5 6 44 55 66 77 88 99
A3 2023 1 2 3 4 5 6 44 55 66 77 88 99
A4 2024 1 2 3 4 5 6

我很难得到的结果表:

账户 年份 十月 十一月 十二月 一月 二月 三月 四月 五月 六月 七月 八月 九月
A1 2021 0 0 0 0 0 0 0 55 66 77 88 99
A2 2022 1 2 3 4 5 6 44 55 66 77 88 99
A3 2023 1 2 3 4 5 6 44 55 66 77 88 99
A4 2024 1 2 3 4 5 6 7
sql snowflake-cloud-data-platform
1个回答
0
投票

这可以通过 UNPIVOT 然后两个过滤器和 rePIVOT 来完成,

OR 已知列并固定为 12:

with cte_pretending_to_be_a_table(Account,Year,Oct,Nov,Dec,Jan,Feb,Mar,Apr,May,Jun, Jul, Aug, Sep) as (
    select * from values
    ('A-1', 2019, 1, 2, 3, 4, 5, 6, 44, 55, 66, 77, 88, 99),
    ('A0', 2020, 1, 2, 3, 4, 5, 6, 44, 55, 66, 77, 88, 99),
    ('A1', 2021, 1, 2, 3, 4, 5, 6, 44, 55, 66, 77, 88, 99),
    ('A2', 2022, 1, 2, 3, 4, 5, 6, 44, 55, 66, 77, 88, 99),
    ('A3', 2023, 1, 2, 3, 4, 5, 6, 44, 55, 66, 77, 88, 99),
    ('A4', 2024, 1, 2, 3, 4, 5, 6, null, null, null, null, null, null)
)
select 
    d.account, 
    d.year,
    date_trunc('month', dateadd('year',-3, current_date())) as m3y,
    iff(date_from_parts(d.year-1, 10, 1) >= m3y, oct, 0) as oct,
    iff(date_from_parts(d.year-1, 11, 1) >= m3y, nov, 0) as nov,
    iff(date_from_parts(d.year-1, 12, 1) >= m3y, dec, 0) as dec,
    iff(date_from_parts(d.year, 1, 1) >= m3y, jan, 0) as jan,
    /* ... */
    iff(date_from_parts(d.year, 5, 1) >= m3y, may, 0) as may,
    iff(date_from_parts(d.year, 6, 1) >= m3y, jun, 0) as jun,
    /* ... */
from cte_pretending_to_be_a_table as d
where year(current_date())-3 <= d.year
order by d.year
;
账户 年份 M3Y 十月 十一月 十二月 一月 五月 六月
A1 2021 2021-05-01 0 0 0 0 55 66
A2 2022 2021-05-01 1 2 3 4 55 66
A3 2023 2021-05-01 1 2 3 4 55 66
A4 2024 2021-05-01 1 2 3 4
© www.soinside.com 2019 - 2024. All rights reserved.