如何按月对数据结果进行分组

时间:2015-04-02 14:17:18

标签: oracle

我写了一个脚本,它会告诉我我们的"按时交付"或者" OTD"是基于当前月份。基本上它会立即告诉我们我们是否在承诺日期之前或之后发运了我们的材料。

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

我将在此处发布脚本以及结果。 (编辑:我想我不能发布结果,因为它不会让我发布图片)任何帮助将不胜感激。谢谢你和BTW,我不是一个程序员,只是偶尔为这些东西工作以获取我们所追求的数据的人。

    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 一月.956 一月.875 1月.359 1月1日 1月1日 1月1日 二月.988 2月.562 二月.875 2月1日 2月1日

等。 这种情况持续了几个月。

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

1 个答案:

答案 0 :(得分: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 - 我怀疑这个表根本不需要,在我们的查询/视图中肯定不需要, 也许你创建它只是为了存储你感兴趣的几个月的日期。 但也许我错了,它被用在其他地方。它可以在我们的视图中用简单的分层子查询替换, 但是现在让我们继续使用当前的解决方案。请在每个月插入一个日期,我没有对更多日期提出任何保护。

为什么查询不起作用? - 你加入了一个数字,比如0,567,由表格GLPERIODS每天两个复杂的查询产生。这就是为什么你有12个月的相同,宝贵的数据。