Mamy widok zwany: vu_pohyby. Zawiera wszystkie towary przychodzące / wychodzące. Ma wiele rekordów.

Wygląda na przykład, na przykład:

  RID         |kod_o |datum_p    |kod_id  |partner |pocet |Cont.n.|storno|cena_dokl
0032000015044 |01    |02.10.2020 |566     |248     |360   |545    |0     |0,250
0292000046277 |      |03.10.2020 |566     |326     |-6    |539    |0     |0,260
0292000046310 |      |04.10.2020 |566     |326     |-6    |533    |0     |0,260
0292000046338 |      |05.10.2020 |566     |325     |-6    |515    |0     |0,260
0292000046350 |      |05.10.2020 |566     |326     |-6    |509    |0     |0,260
          -20 |      |05.10.2020 |566     |        |350   |509    |0     |0,000
                            
Continuous number -> 
(sum (decode(STORNO, 0, decode(L.RID, '-20', 0,l.pocet),0)) over (ORDER BY l.datum_p ROWS UNBOUNDED PRECEDING))

Chcę uzyskać różnicę między cenami -> dochód / wychodzący w innej tabeli.

Chcę więc wybrać 2 ceny, które są powiązane z najwyższą datą (DATUM_P).

Próbowałem, ale nie jest dobrze:

(select price_out from ( 
 select l.kod_id,  --goods
 l.cena_dokl as price_out
from vu_pohyby l --table
where l.storno=0 and l.kod_o is null --canceled=0, l.kod_o->flag=out/incoming
 and substr(l.rid,1,3)='029' -- 029->out
group by l.rid, l.datum_p, l.kod_id, l.cena_dokl
order by l.datum_p desc ) 
aa where aa.kod_id=sklad_karta.id and rownum=1)
-
(select price_inc from ( 
 select l.kod_id,
 l.cena_dokl as price_inc
from vu_pohyby l 
where l.storno=0 
and substr(l.rid,1,3)='003' --003->incoming
group by l.rid, l.datum_p, l.kod_id, l.cena_dokl
order by l.datum_p desc ) 
aa where aa.kod_id=sklad_karta.id and rownum=1)

Uproszczenie:

Chcę rozpraszać 2 ceny:

1: ... gdzie max (DATUM_P), KOD_O = NULL, STORNO = 0 - & GT; W tym przypadku 0292000046350 - & gt; 0,26

2: ... gdzie max (DATUM_P), KOD_O = 01, STORNO = 0 - & GT; W tym przypadku 0032000015044 - & gt; 0,25 Różnica: 0,01.

Jak mogę rozwiązać to w jednym zapytaniu?

0
Know-nothing 8 październik 2020, 13:03

1 odpowiedź

Najlepsza odpowiedź

Myślę, że chcesz użyć MAX( cena_dokl ) KEEP ( DENSE_RANK LAST ORDER BY datum_p ), aby uzyskać wartość najnowszą datę, a następnie chcesz filtrować za rzędy Cena w / Cena. Coś jak:

SELECT kod_id,
       MAX( CASE WHEN kod_o IS NULL THEN datum_p END )
         AS date_most_recent_price_out,
       MAX( CASE WHEN kod_o IS NULL THEN cena_dokl END ) KEEP (
         DENSE_RANK LAST
         ORDER BY CASE WHEN kod_o IS NULL THEN datum_p END ASC NULLS FIRST
       ) AS most_recent_price_out,
       MAX( CASE WHEN kod_o IS NOT NULL THEN datum_p END )
         AS date_most_recent_price_in,
       MAX( CASE WHEN kod_o IS NOT NULL THEN cena_dokl END ) KEEP (
         DENSE_RANK LAST
         ORDER BY CASE WHEN kod_o IS NOT NULL THEN datum_p END ASC NULLS FIRST
       ) AS most_recent_price_in
FROM   vu_pohyby
WHERE  storno=0
AND    (  ( kod_o IS NULL     AND rid LIKE '029%' )
       OR ( kod_o IS NOT NULL AND rid LIKE '003%' ) )
GROUP BY
       kod_id

Które dla twoich danych testowych:

CREATE TABLE vu_pohyby ( RID, kod_o, datum_p, kod_id, partner, pocet, "Cont.n.", storno, cena_dokl ) AS
SELECT '0032000015044', '01', DATE '2010-10-02', 566, 248,  360, 545, 0, 0.250 FROM DUAL UNION ALL
SELECT '0292000046277', NULL, DATE '2010-10-03', 566, 326,   -6, 539, 0, 0.260 FROM DUAL UNION ALL
SELECT '0292000046310', NULL, DATE '2010-10-04', 566, 326,   -6, 533, 0, 0.260 FROM DUAL UNION ALL
SELECT '0292000046338', NULL, DATE '2010-10-05', 566, 325,   -6, 515, 0, 0.260 FROM DUAL UNION ALL
SELECT '0292000046350', NULL, DATE '2010-10-05', 566, 326,   -6, 509, 0, 0.260 FROM DUAL UNION ALL
SELECT '          -20', NULL, DATE '2010-10-05', 566, NULL, 350, 509, 0, 0.000 FROM DUAL

Wyjścia:

KOD_ID | DATE_MOST_RECENT_PRICE_OUT | MOST_RECENT_PRICE_OUT | DATE_MOST_RECENT_PRICE_IN | MOST_RECENT_PRICE_IN
-----: | :------------------------- | --------------------: | :------------------------ | -------------------:
   566 | 2010-10-05                 |                   .26 | 2010-10-02                |                  .25

db & lt; & gt; Fiddle Oto

1
MT0 8 październik 2020, 10:35