2017-03-20 4 views
0

Ich verwende das folgende Skript, um die Bestellhistorie einer bestimmten Fertigungsreihenfolge zu erhalten;Oracle SQL, Berechnung der nächsten Bestellmenge basierend auf der Bestellhistorie

select ds.status, ds.catnr, ds.part_no, ds.print_type, ds.nr_discs, ds.qty, ds.ship_date 
from 
(select 'Open Order' status, gb.catnr, gb.part_no, decode(gb.tec_criteria,'XX','SCREEN','OF','OFFSET','PI','OFFSET','MC','OFFSET') print_type, sp.nrunits nr_discs, sum(gb.or_menge_fd) qty, min(trunc(gb.shd_date)) ship_date 
from gps_beweg gb, oes_customer oc, scm_packtyp sp 
where gb.part_no = 'A0101628358-VV92-1900' 
and gb.uebergabe_oes = '1' 
and gb.pwerk_disc = 'W' 
and gb.cunr = oc.cunr 
and gb.packtyp = sp.packtyp 
group by gb.cunr, oc.name, gb.part_no, sp.nrunits, gb.tec_criteria, gb.catnr, gb.prodtyp, gb.packtyp 
UNION ALL 
select unique 'Shipped Order' status, 
null catnr, null part_no, null print_type, null nr_discs, 
(select sum(ds1.planqty) from oes_delsegview ds1 where ds.ordnr = ds1.ordnr and ds.catnr = ds1.catnr and ds.prodtyp = ds1.prodtyp and ds.packtyp = ds1.packtyp) qty, 
(select trunc(max(ds1.gps_planshpdate)) from oes_delsegview ds1 where ds.ordnr = ds1.ordnr and ds.catnr = ds1.catnr and ds.prodtyp = ds1.prodtyp and ds.packtyp = ds1.packtyp) ship_date 
from part_description pd1, oes_delsegview ds 
where pd1.part_no = 
    (select max(gb.part_no) 
     from gps_beweg gb 
     where gb.part_no = 'A0101628358-VV92-1900' 
     and gb.uebergabe_oes = '1' 
     and gb.pwerk_disc = 'W') 
and pd1.catnr = ds.catnr 
and pd1.prodtyp = ds.prodtyp 
and pd1.packtyp = ds.packtyp 
and ds.ord_o_status in ('7','9') 
order by status, ship_date desc) ds 
where rownum <=5 

Das Ergebnis für dieses Skript sieht wie folgt aus ...

enter image description here

Ich möchte die Daten in der Menge und SHIP_DATE Spalte verwenden, um die nächste Menge und Zeitpunkt vorherzusagen. Ich kann dies in Excel mit der TREND-Funktion tun. Gibt es eine Möglichkeit, dies in SQL zu tun? Wird es in Übereinstimmung mit der REGR_SLOPE-Funktion sein (ich kann nicht verstehen, wie das funktioniert!?!).

+0

Soweit ich weiß, ist nichts in Oracles SQL eingebaut, um Ihnen hier zu helfen. Es existiert jedoch eine Prognoseberichtfunktion: https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_commands_1052.htm#OLADM822. Ich habe das nie benutzt und würde nicht wissen, wie ich es aufrufen soll. Sie können dies möglicherweise irgendwie verwenden oder das außerhalb des DBMS mit Excel oder einem anderen Tool ausführen, das die Funktionalität bereitstellt. –

+0

Danke für die Rückmeldung, ich werde die Prognosefunktion auschecken (Danke für den Link). Ich denke, ich muss möglicherweise wieder auf die Excel-Funktionen zurückgreifen. – SMORF

Antwort

1

Wie gesagt, Oracle SQL hat keine eingebauten Trendfunktionen, um Ihnen hier zu helfen. Sie könnten jedoch mit analytischen Funktionen experimentieren und einen Algorithmus entwickeln.

ship_date - LAG(ship_date) OVER (ORDER BY ship_date) gibt Ihnen die Tage zwischen letzter und aktueller Bestellung zum Beispiel. Sie müssten diese Werte gewichten, sagen Sie, multiplizieren Sie sie mit ROW_NUMBER() OVER (ORDER BY ship_date). Dann teilen Sie, um den Wert zu MAX(ship_date) hinzuzufügen.

Hier ist die entsprechende Abfrage. Ein bisschen schwer zu lesen und zu verstehen, aber immer noch eine Option meiner Meinung nach. Die Abfrage ruft alle Ihre Zeilen sowie ein Trenddatum und eine Menge für jede Zeile ab. So können Sie sehen, was zu einem bestimmten Zeitpunkt vorhergesagt worden wäre und welche Sendung wirklich folgte. Die letzte Zeile gibt Ihnen die aktuelle Prognose.

select 
    status, catnr, part_no, print_type, nr_discs, qty, ship_date, 
    round(qty + sum(qty_diff_weighted) over (order by rn)/
    (sum(rn) over (order by rn) - 1)) as trend_qty, 
    round(ship_date + sum(date_diff_weighted) over (order by rn)/
    (sum(rn) over (order by rn) - 1)) as trend_date 
from 
(
    select 
    status, catnr, part_no, print_type, nr_discs, qty, ship_date, 
    row_number() over (order by ship_date) * 
     (qty - lag(qty) over (order by ship_date)) as qty_diff_weighted, 
    row_number() over (order by ship_date) * 
     (ship_date - lag(ship_date) over (order by ship_date)) as date_diff_weighted, 
    row_number() over (order by ship_date) as rn 
    from (your query) 
) 
order by ship_date; 

Ergebnis:

 
STATUS   CATNR ... QTY SHIP_DATE TREND_QTY TREND_DATE 
Shipped Order     500 06.06.2014 
Shipped Order     500 17.11.2014 500   30.04.2015 
Shipped Order     300 21.09.2015 180   28.05.2016 
Shipped Order     300 16.08.2016 233   29.05.2017 
Open Order  PPD168  300 24.03.2017 257   11.12.2017 

Dies zeigt die Technik. Vielleicht finden Sie einen völlig anderen Algorithmus, der Ihnen natürlich besser gefällt.

+0

Diese Ergebnisse sind nicht weit von den Ergebnissen, die ich von Excel TREND bekommen habe ... Ich kann einige verschiedene Algorithmen testen, aber ich schätze den Rat sehr. Das hat mich definitiv in die richtige Richtung gelenkt. Vielen Dank. – SMORF

Verwandte Themen