sql >> Database >  >> RDS >> Oracle

Oracle-query om eerste transactie-ID te krijgen op basis van verbruikte uitgaande transactie

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 

Ik voeg invoer en uitvoer samen en gebruik vervolgens de analytische functies sum() en max() Ik bereid alle benodigde informatie voor, het belangrijkste is de cumulatieve som. Je kunt zien dat het de meest innerlijke query afzonderlijk uitvoert, dit onder de alias tr .

De volgende stap is alleen het toevoegen van row_number() om de eerste rij(en) te vinden waar de invoer groter is dan de uitvoer en deze rij en het resterende verschil te tonen.

Deze voorwaarde:or oq2 is null is nodig om ook andere delen te tonen (hier PA000535 ).

Lees over analytische functies, er zijn veel tutorials op het net.

Testgegevens:

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

Uitgang:

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



  1. Hoe een schema te repliceren met dezelfde privileges van een bestaand account in Oracle?

  2. Hoe SQL-opdracht uit te voeren met parameters in bash-script

  3. Gegoten van VARCHAR naar INT - MySQL

  4. JDBC-batch met PreparedStatement werkt niet in MySQL