item year month amt
A 2018 01 1
A 2018 02 7
A 2018 03 5
A 2018 04 0
A 2018 05 0
A 2018 06 2
A 2018 07 3
A 2018 08 1
B 2018 01 0
B 2018 02 0
B 2018 03 1
B 2018 04 2
B 2018 05 0
B 2018 06 0
B 2018 07 5
B 2018 08 1
C 2018 06 100
C 2018 07 0
C 2018 08 200
일시
ITEM 01 02 03 04 05 06 07 08
A 1 7 5 5 5 2 3 1
B 0 0 1 2 2 2 5 1
B 0 0 0 0 0 100 100 200
이렇게 해당월의 값이 0 이거나 없을시 이전의 값을 가진 최근 달의 값을 가지고 오고 싶습니다.
어떻게 하면 좋을까요?
스칼라 반환 함수를 쓰니 데이타가 많아 너무 느리고... 좋은 방법이 없을까요?
Comment 1
-
건우아빠
2018.12.21 13:04
먼저 값을 만들고 피벗으로 돌려시면 될듯 합니다 .
값을 만드실때 재귀쿼리를 하시면 간단한 로직일텐데 머리가 안돌아가네요,..... 고수님들이 재귀로
누적 쿼리 를 이용해서 0일때 전값을 만드는 방법입니다. 참고 하세요..
이 결과를 가지고 피벗을 돌리시면 .....
with res as
(
select 'A' item , '2018' year, '01' month ,1 amt union all
select 'A' item , '2018' year, '02' ,7 union all
select 'A' item , '2018' year, '03' ,5 union all
select 'A' item , '2018' year, '04' ,0 union all
select 'A' item , '2018' year, '05' ,0 union all
select 'A' item , '2018' year, '06' ,2 union all
select 'A' item , '2018' year, '07' ,3 union all
select 'A' item , '2018' year, '08' ,1 union all
select 'B' item , '2018' year, '01' ,0 union all
select 'B' item , '2018' year, '02' ,0 union all
select 'B' item , '2018' year, '03' ,1 union all
select 'B' item , '2018' year, '04' ,2 union all
select 'B' item , '2018' year, '05' ,0 union all
select 'B' item , '2018' year, '06' ,0 union all
select 'B' item , '2018' year, '07' ,5 union all
select 'B' item , '2018' year, '08' ,1 union all
select 'C' item , '2018' year, '06' ,100 union all
select 'C' item , '2018' year, '07' ,0 union all
select 'C' item , '2018' year, '08' ,200 ) ,
resA as (
select * , row_number() over(partition by item ,year order by month) no
from res ) ,
result as
(
select a.item ,a.year ,a.month ,a.no,a.amt , b.no b_no , b.amt b_amt
from resA a left JOIN resA b on a.item = b.item and a.year = b.year and a.no > b.no
)
select a.item ,a.year ,a.month ,
case when a.amt = 0 then ISNULL( ( select amt from resA where item = a.item and year = a.year and no = b.b_no) ,0)
else a.amt end amt
from res a
outer apply
(
select max(b_no) b_no
from result
where item = a.item
and year = a.year
and month <= a.month
and b_amt <> 0
) b