如何获取上一个数字(如果为 0),然后使用 LAG 语法获取上个月的数字

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

来源数据: 账户期间金额 AC100 100 年 1 月 AC100 二月 0 AC100 三月 0 AC100 四月 0 AC100 五月 0 AC100 六月 600 AC100 七月 700 AC100 八月 0 AC100 九月 0 AC100 1000 年 10 月 AC100 十一月 0 AC100 1200 年 12 月

我使用查询

WITH CTE AS (
    SELECT
        Account,
        Period,
        Amount,
        LAG(Amount, 1, 0) OVER (PARTITION BY Account ORDER BY (SELECT NULL)) AS PreviousAmount
    FROM TableA
)
SELECT
    Account,
    Period,
    CASE WHEN Amount = 0 THEN PreviousAmount ELSE Amount END AS Amount
FROM CTE

但结果只取上个月的金额,如下图:

如何确保金额 0 仍然填满之前的数字?

sql sql-server lag sql-server-2019
1个回答
0
投票

使用您的示例数据:

create table #data
(
    Account varchar(5),
    [Period] varchar(9),
    amount int
)

insert into #data values
('AC100','January',100),
('AC100','February',0),
('AC100','March',0),
('AC100','April',0),
('AC100','May',0),
('AC100','June',600),
('AC100','July',700),
('AC100','August',0),
('AC100','September',0),
('AC100','October',1000),
('AC100','November',0),
('AC100','December',1200)

您可以使用

OUTER APPLY
来找到最后一个非零
amount
并在
amount
值为零时返回该值:

select
    d.Account,
    d.[Period],
    case when d.amount = 0 then lastNum.lastAmount else d.amount end as amount
from #data d
outer apply
(
    select top 1 amount as lastAmount
    from #data l
    where month(l.[Period] + '1 1900') < month(d.[Period] + '1 1900')
    and l.amount <> 0
    order by month(l.[Period] + '1 1900') desc
) lastNum

结果:

账户 期间 金额
AC100 一月 100
AC100 二月 100
AC100 三月 100
AC100 四月 100
AC100 五月 100
AC100 六月 600
AC100 七月 700
AC100 八月 700
AC100 九月 700
AC100 十月 1000
AC100 十一月 1000
AC100 十二月 1200
© www.soinside.com 2019 - 2024. All rights reserved.