来源数据: 账户期间金额 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
使用您的示例数据:
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 |