첫째, 적절한 이름을 사용 누적 합계를 계산하는 방법 중 하나는 상관 하위 쿼리를 사용하는 것입니다 플랫폼을 사용하면 현재 참조 자료를 찾을 확률이 훨씬 높아집니다. IBM i 문서는 Knowledge Center에 있습니다.
둘째, 세 가지 DB2 계열이 있습니다. IBM i 제품군에는 아직 LEAD 및 LAG가 없습니다. (다른 패밀리는 LUW (Linux, Unix, Windows) 및 z - mainframes 용 DB2입니다.)
SQL 세트 처리가 상대 레코드 x 호가 아닌 세트에 집중되는 경향이있어서 요구가 약간 이상합니다. 따라서 단순한 부모/자식 관계가 없기 때문에 재귀 CTE를 사용할 수 없습니다. 그러나, brute force가 적용될 수 있습니다.
create table so (
WorkCenter char(5),
TotalQuantity decimal(7, 0),
ScrapQuantity decimal(7, 0),
WorkCenterQuantity decimal(7, 0)
);
insert into so values ('A', 1000, 10, 990);
insert into so values ('B', 1000, 5, 985);
insert into so values ('C', 1000, 12, 973);
insert into so values ('D', 1000, 1, 972);
select 1 as level, WorkCenter, TotalQuantity, ScrapQuantity, WorkCenterQuantity, TotalQuantity - ScrapQuantity as newQUantity
from so
where rrn(so) = 1
union all
select rrn(o) as level, o.WorkCenter, o.TotalQuantity, o.ScrapQuantity, o.WorkCenterQuantity,
(select i.WorkCenterQuantity
from so i
where rrn(i) = rrn(o) - 1) - o.ScrapQuantity as NewWorkCenterQuantity
from so o
where rrn(o) > 1
order by 1;
아이디어는 현재 행에서 열이 계산 첫 번째 행을 잡아이며, UNION 그 후속 현재 및 이전 행을 모두 사용하여 계산을 사용하여 행한다.
EDIT WorkCenterQuantity가 0이라고 가정합니다. 계산에 @ Tim의 누적 합계를 사용하십시오.
update so
set WorkCenterQuantity = 0;
update so u
set WorkCenterQuantity = (
select NewWorkCenterQuantity
from
(select 1 as level, WorkCenter, TotalQuantity, ScrapQuantity, WorkCenterQuantity, TotalQuantity - ScrapQuantity as NewWorkCenterQuantity
from so
where rrn(so) = 1
union all
select rrn(o) as level, o.WorkCenter, o.TotalQuantity, o.ScrapQuantity, o.WorkCenterQuantity,
(select TotalQuantity
from so
where rrn(so) = 1)
-
(select sum(i.ScrapQuantity)
from so i
where rrn(i) <= rrn(o)) as NewWorkCenterQuantity
from so o
where rrn(o) > 1
) x
where u.WorkCenter = x.WorkCenter)
;
개념은 행 N + 1의 누계를 사용하여 계산을 수행하는 것이지만, 행 (1)에서 초기 량 입수.
가하는 방법이 있나요 이전 레코드를 식별하는 데 사용할 수있는 데이터 또는 기본 키의 순서? – rbr94
내 생각에, 이것은 거의 비슷합니다 - http://stackoverflow.com/questions/32066074/how-to-add-and-subtract-value-from-previous-rows-based-on-condition –
@ AT-2016, 이것은 SQL 서버용입니다. 그것이 나를 위해 작동하는지 확실하지 않습니다. – ehh