2015-04-02 205 views
0

我有一段脚本,可以告诉我“按时交付”或“OTD”基于当月的情况。从本质上讲,它立即告诉我们是否在我们的承诺日期之前或之后运送了我们的材料。如何按月份对数据结果进行分组

我现在要做的是创建一个新脚本,将其与我们的GLPERIODS表绑定,以便我可以一目了然地显示每年的“OTD”是什么。当我运行这个新的时候,我得到正确的时期(1月 - 12月),但我的OTD计算没有按期间分组。相反,它们都是相同的,我认为它是我们系统中所有数据的平均值。

我会在这里发布脚本以及结果。 (编辑:我想我不能发布结果,因为它不会让我发布图片)任何帮助将不胜感激。谢谢,顺便说一句,我不是程序员,只是偶尔从事这些工作的人来获取我们之后的数据。

Select "month", 
    OTD 
From (Select Round((1 - ("Late"/"All")), 3) As OTD 
    From (Select Round(Count(V_RELEASES_COMB.ACTUAL_SHIPDATE), 2) As "Late" 
    From V_RELEASES_COMB, 
     GLPERIODS 
    Where To_Char(V_RELEASES_COMB.ACTUAL_SHIPDATE, 'MM/YYYY') = 
     To_Char(GLPERIODS.START_DATE, 'MM/YYYY') And 
     V_RELEASES_COMB.ACTUAL_SHIPDATE > V_RELEASES_COMB.PROMISE_DATE And 
     V_RELEASES_COMB.ITEMNO Is Not Null And V_RELEASES_COMB.CUMM_SHIPPED > 0), 
    (Select Case 
     When Round(Count(V_RELEASES_COMB.ACTUAL_SHIPDATE), 2) = 0 Then 1 
     Else Round(Count(V_RELEASES_COMB.ACTUAL_SHIPDATE), 2) End As "All" 
    From V_RELEASES_COMB, 
     GLPERIODS 
    Where To_Char(V_RELEASES_COMB.ACTUAL_SHIPDATE, 'MM/YYYY') = 
     To_Char(GLPERIODS.START_DATE, 'MM/YYYY') And V_RELEASES_COMB.ITEMNO Is Not 
     Null And V_RELEASES_COMB.CUMM_SHIPPED > 0)), 
    (Select To_Char(GLPERIODS.START_DATE, 'MONTH') As "month" 
    From GLPERIODS 
    Where Extract(Year From GLPERIODS.START_DATE) = Extract(Year From SysDate)) 

好的,谢谢你的帮助!这里是你的输入编辑的脚本中加入:

Select "month", 
    OTD 
From (Select trunc(g.start_date, 'Month') mth, 
    round (1 - (count(
     case when v.ACTUAL_SHIPDATE > v.PROMISE_DATE And v.ITEMNO Is Not Null 
      And v.CUMM_SHIPPED > 0 then V.ACTUAL_SHIPDATE end) 
    /greatest(Count(
     case when v.ITEMNO Is Not Null And v.CUMM_SHIPPED > 0 then V.ACTUAL_SHIPDATE end 
    ), 1)) , 3) OTD 
    from glperiods g 
    left join v_releases_comb v 
     on trunc(v.ACTUAL_SHIPDATE, 'Month') = trunc(g.start_date, 'Month') 
    group by trunc(g.start_date, 'Month')), 
    (Select To_Char(GLPERIODS.START_DATE, 'MONTH') As "month" 
    From GLPERIODS 
    Where Extract(Year From GLPERIODS.START_DATE) = Extract(Year From SysDate)) 

结果看起来很有前途,但这里所发生的事情:

月OTD 一月0.956 月.875 月0.359 1月1日 1月1日 年1月1日 0.978 月.562 月.875 2月1日 2月1日

等 这个持续了所有月份。

以上是表格格式,但我不知道如何在此网站上发布表格。我希望我只能上传一张照片,但它不会让我。

回答

0

这个查询应该做的工作:

SQLFiddle

select to_char(mth, 'Month') "Month", OTD 
    from (Select trunc(g.start_date, 'Month') mth, 
     round (1 - (count(
     case when v.ACTUAL_SHIPDATE > v.PROMISE_DATE And v.ITEMNO Is Not Null 
       And v.CUMM_SHIPPED > 0 then V.ACTUAL_SHIPDATE end) 
    /greatest(Count(
      case when v.ITEMNO Is Not Null And v.CUMM_SHIPPED > 0 then V.ACTUAL_SHIPDATE end 
     ), 1)) , 3) OTD 
    from glperiods g 
     left join v_releases_comb v 
     on trunc(v.ACTUAL_SHIPDATE, 'Month') = trunc(g.start_date, 'Month') 
    Where Extract(Year From g.START_DATE) = Extract(Year From SysDate) 
    group by trunc(g.start_date, 'Month')) 
    order by mth 

没有几个例子,很难肯定地说,它是确定,这将是很好验证的东西。 所以,如果有什么不对,请编辑您的帖子,添加一些示例行并解释。


编辑: 我认为创建view可能是您更舒适:

create or replace view v_monthly_sums as 
    Select trunc(g.start_date, 'Month') mth, 
     count(case when v.ACTUAL_SHIPDATE > v.PROMISE_DATE And v.ITEMNO Is Not Null 
     And v.CUMM_SHIPPED > 0 then V.ACTUAL_SHIPDATE end) d1, 
     Count(
      case when v.ITEMNO Is Not Null And v.CUMM_SHIPPED > 0 then V.ACTUAL_SHIPDATE end 
     ) d2 
    from glperiods g 
     left join v_releases_comb v 
     on trunc(v.ACTUAL_SHIPDATE, 'Month') = trunc(g.start_date, 'Month') 
    group by trunc(g.start_date, 'Month') 

从这个视图中,您可以选择所有的值(select * from v_monthly_sums),看看它包含了,做任何实验中, 但你的主要问题,你可以使用类似:

select to_char(mth, 'Month') "Month", 
    case 
     when d2 = 0 then null 
     else round(1-d1/d2, 3) 
    end otd 
    from v_monthly_sums 
    where extract(Year From mth) = 2015 -- you can add here: AND D2<>0 to eliminate null rows 
    order by mth 

GLPERIODS - 我怀疑日是根本不需要的表格,在我们的查询/查看当然不需要, 也许你创建它只是为了保存你感兴趣的月份的日期。 但也许我错了,它被用在别的地方。它可以在我们的视图中用简单的分层子查询 代替,但现在让我们继续使用当前的解决方案。请为每个月插入一个日期,我没有对更多日期进行保护。

为什么你的查询没有工作? - 你从表GLPERIODS每天加入一个数字,比如0,567,由其他两个复杂查询产生。这就是为什么你有相同的,无价的数据12个月的原因。

+0

除了上述信息,我添加到我的帖子,我发现,如果我通过代码删除组,我得到一个有12个月的好桌子。问题在于所有12个月的OTD值都是一样的。如果我通过代码离开团队,我会得到约1月60日,2月60日等,虽然他们似乎有一些不同的OTD值。 – 2015-04-02 19:01:05

+0

不要删除GROUP BY :)不要再为GLPERIODS添加子查询:)它会产生交叉连接,您将有许多不必要的行。只需运行我的查询,我几乎没有修改它,只为当前年份日期添加'WHERE'子句。 – 2015-04-02 19:06:16

+0

哦,你是一个天才。这工作!如果没有数据,是否有办法使OTD值为零(0)?现在它显示一个1.再次感谢你! – 2015-04-02 19:12:14

相关问题