Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zapytanie Oracle w celu uzyskania pierwszego identyfikatora transakcji na podstawie zużytej transakcji wychodzącej

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 

Łączę wejście i wyjście, a następnie używam funkcji analitycznych sum() i max() Przygotowuję wszystkie potrzebne informacje, najważniejsza jest suma zbiorcza. Możesz zobaczyć, że uruchamia on najbardziej wewnętrzne zapytanie osobno, to jest aliasem tr .

Następnym krokiem jest tylko dodanie row_number() aby znaleźć pierwsze wiersze, w których dane wejściowe są większe niż dane wyjściowe i pokazać ten wiersz i pozostałą różnicę.

Ten warunek:or oq2 is null jest potrzebne, aby pokazać również inne części (tutaj PA000535 ).

Przeczytaj o funkcjach analitycznych, w sieci jest wiele samouczków.

Dane testowe:

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

Wyjście:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TRANSLATE(… UŻYWAJĄC) Funkcja w Oracle

  2. Jak uzyskać dni robocze lub godziny między dwiema datami?

  3. Oracle wybierz wartość do pierwszego miejsca lub końca wiersza

  4. Tabela przeglądowa DATE (1990/01/01:2041/12/31)

  5. Oracle PL/SQL:Sprawdź, czy BLOB lub CLOB jest pusty