2017-03-20 8 views
0

次のスクリプトを使用して、特定の製造指図の注文履歴を取得しています。注文履歴に基づいて次の注文数を計算するOracle SQL

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 

このスクリプトの結果は次のようになります...

enter image description here

私は次の数量と日付を予測するQTYと列SHIP_DATE列のデータを使用したいと思います。 TREND関数を使ってExcelでこれを行うことができます。 SQLでこれを行う方法はありますか?それはREGR_SLOPE関数と一線を画していますか(これはどういうふうに頭がおかしくないのでしょうか?!)。

+0

私が知る限り、ここであなたを助けるためにOracleのSQLには何も組み込まれていません。ただし、予測レポート機能があります(https://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_commands_1052.htm#OLADM822)。私はこれを使ったことがなく、実際に呼び出す方法はわかりません。何らかの形でこれを使用したり、エクセルなどの機能を提供するツールを使用してDBMSの外部で行うことができます。 –

+0

フィードバックいただきありがとうございます、私は予測機能をチェックアウトします(リンクのおかげで)。私は、Excelの機能を使用することに戻る必要があるかもしれないと思う。 – SMORF

答えて

1

前述のとおり、OracleのSQLには、ここで役立つトレンド機能は組み込まれていません。しかし、あなたができることは、分析関数を使いこなし、アルゴリズムを考え出すことです。

ship_date - LAG(ship_date) OVER (ORDER BY ship_date)は、例として最後の注文と現在の注文の日数を示します。あなたはこれらの値を重み付けする必要がありますが、ROW_NUMBER() OVER (ORDER BY ship_date)でそれらを乗算してください。次に除算して、値をMAX(ship_date)に加算します。

これは、次のクエリです。読んで理解するのが少し難しいですが、私の意見ではまだ選択肢です。クエリは、あなたのすべての行と、各行の傾向日付と数量を取得します。それで、あなたはいつか予告されていたものと、実際に何が出荷されたのかを見ることができます。最後の行には現在の予測が表示されます。

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; 

結果:

 
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 

これはテクニックを示しています。もちろん、あなたにとってはまったく異なるアルゴリズムを思いつくかもしれません。

+0

これらの結果は、私がExcel TRENDから得た結果とはそれほど離れているわけではありません...私はいくつかの異なるアルゴリズムをテストするかもしれませんが、本当に助言に感謝します。これは間違いなく正しい方向に私を指摘しています。ありがとうございました。 – SMORF

関連する問題