sql >> Databáze >  >> RDS >> Oracle

Oracle dotaz na získání ID první transakce na základě spotřebované odchozí transakce

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



  1. phpexcel export do excelu s obrázkem

  2. MySQL:Získejte n-tou nejvyšší hodnotu pro každou skupinu v tabulce

  3. Soubor obrázku CodeIgniter nelze nahrát

  4. Váš dokonalý průvodce SQL Join:INNER JOIN – Část 1