sql >> Databasteknik >  >> RDS >> Oracle

Oracle-fråga för att få första transaktions-ID baserat på förbrukad utgående transaktion

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 

Jag sammanfogar input och output och använder sedan analytiska funktioner sum() och max() Jag förbereder all nödvändig information, viktigast är den ackumulerade summan. Du kan se att den kör den mest inre frågan separat, denna alias som tr .

Nästa steg är bara att lägga till row_number() för att hitta första rad(er) där input är större än utdata och visa denna rad och återstående skillnad.

Detta villkor:or oq2 is null behövs för att även visa andra delar (här PA000535 ).

Läs om analytiska funktioner, det finns många tutorials på nätet.

Testdata:

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);

Utdata:

ID              PART_NO          REST
--------------- ---------- ----------
TE201708000003  GSDFGSG            20
TE201709000003  PA000535



  1. jsp jstl sql konstigt beteende med som i mysql

  2. Dela upp värden över flera rader

  3. Postgres infogar rad endast om radantalet är under en gräns

  4. Hur man ansluter Grails 3.0 till min lokala Mysql-databas