2015-04-02 143 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