sql >> Database teknologi >  >> RDS >> Oracle

Oracle-forespørgsel for at få første transaktions-id baseret på forbrugt udgå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 

Jeg forbinder input og output og bruger derefter analytiske funktioner sum() og max() Jeg forbereder alle nødvendige informationer, det vigtigste er kumulativ sum. Du kan se den køre den mest indre forespørgsel separat, dette kaldet tr .

Næste trin er kun at tilføje row_number() for at finde første række(r), hvor input er større end output og vise denne række og resterende forskel.

Denne betingelse:or oq2 is null er nødvendig for også at vise andre dele (her PA000535 ).

Læs venligst om analytiske funktioner, der er mange tutorials på nettet.

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

Output:

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



  1. PostgreSQL pg_dump

  2. Er der en officiel anbefaling fra Oracle om brugen af ​​eksplicitte ANSI JOINs vs implicitte joinforbindelser?

  3. Hent tid fra MySQL som TT:MM-format

  4. Forskellen mellem at tilføje parametre til lagret procedure i SQL Server?