select id, part_no, sq2-oq2 rest
from (
select tr.*, row_number() over (partition by part_no order by id) rnk
from (select i.transaction_equipmentid id, part_no, i.quantity iq,
sum(i.quantity) over (partition by part_no
order by i.transaction_equipmentid) sq1,
sum(i.quantity) over (partition by part_no) sq2,
o.quantity oq1,
max(o.quantity) over (partition by part_no) oq2
from wa_ii_tbl_tr_equipment i
left join wa_ii_tbl_tr_out_equipment o
on o.transaction_equipmentid_fk = i.transaction_equipmentid
where i.supplierid_fk = 62551 ) tr
where sq1 >= oq2 or oq2 is null )
where rnk = 1
Spojuji vstup a výstup a poté pomocí analytických funkcí sum()
a max()
Připravuji všechny potřebné informace, nejdůležitější je kumulativní součet. Můžete vidět, že běží ten nejvnitřnější dotaz samostatně, tento alias jako tr
.
Dalším krokem je pouze přidání row_number()
najít první řádek(y), kde je vstup větší než výstup, a zobrazit tento řádek a zbývající rozdíl.
Tato podmínka:or oq2 is null
je potřeba zobrazit i další díly (zde PA000535
).
Přečtěte si prosím o analytických funkcích, na internetu je mnoho návodů.
Testovací data:
create table WA_II_TBL_TR_EQUIPMENT(
TRANSACTION_EQUIPMENTID varchar2(15), DESCRIPTION varchar2(10),
SUPPLIERID_FK number(6), PART_NO varchar2(10), QUANTITY number(6));
insert into WA_II_TBL_TR_EQUIPMENT values ('TE201708000002', 'fg', 62551, 'GSDFGSG', 2);
insert into WA_II_TBL_TR_EQUIPMENT values ('TE201709000003', 'fg', 62551, 'PA000535', 7);
insert into WA_II_TBL_TR_EQUIPMENT values ('TE201709000002', 'fg', 62551, 'GSDFGSG', 9);
insert into WA_II_TBL_TR_EQUIPMENT values ('TE201708000004', 'fg', 62551, 'GSDFGSG', 10);
insert into WA_II_TBL_TR_EQUIPMENT values ('TE201708000003', 'fg', 62551, 'GSDFGSG', 2);
insert into WA_II_TBL_TR_EQUIPMENT values ('TE201709000001', 'Test', 48544, 'Test', 8);
create table WA_II_TBL_TR_OUT_EQUIPMENT(
TRANSACTION_OUT_EQUIPMENTID varchar2(15),
TRANSACTION_EQUIPMENTID_FK varchar2(15),
QUANTITY number(6));
insert into WA_II_TBL_TR_OUT_EQUIPMENT values('TOE201709000001', 'TE201708000002', 3);
Výstup:
ID PART_NO REST
--------------- ---------- ----------
TE201708000003 GSDFGSG 20
TE201709000003 PA000535