2017-03-20 61 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

我想用数据的数量和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。我从来没有使用过,实际上也不知道如何调用它。您可以以某种方式使用它,或者使用Excel或任何提供该功能的工具在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趋势中得到的结果并不遥远......我可能会测试一些不同的算法,但我非常感谢这些建议。这无疑给我指出了正确的方向。谢谢。 – SMORF