2013-04-09 18 views
1

我已經在本網站上使用了一段時間的信息,現在有一個大型項目需要您的一些專業知識。我在Oracle 11g環境中工作,並且還具有Cognos Report Studio 10.1使用Oracle和Report Studio構建數據分析報告

我正在構建一個多標籤報表,顯示部門出庫單的分析。我創建了一個包含大約30列數據的自定義表格。從這裏開始,每天必須在桌上進行超過150次計算。這些計算的一個例子是
1)今天收到多少訂單?
2)今天收到的訂單中,同一天發貨多少?
3)有多少訂單被擱置?

核心表上的4-5行查詢基本上是100。我曾想過創建第二個表並使用WITH子句,在過程中執行計算並將其插入表中。

爲了解決這個問題,有誰寫過一個執行大量計算的程序/包,並且有任何可以建議的鏈接/網頁?我的搜索並沒有引導我創建這種性質報告的任何實例,並且希望確保我的方法儘可能高效。提前感謝任何信息/資源。

+0

的頻率有多這些值的變化?你的報告中的數據最近有多久?如果可以接受的話,預先計算數據是相當標準的。 – 2013-04-12 09:04:14

+0

這些數據計算表示生產當天的交易和訂單變化,它將保存一個月的數據。因此,除了當前日子以外,每天都需要填寫過去的數據。 – RNORRIS 2013-04-12 11:25:34

回答

1

表和存儲過程是一個好主意。一些注意事項: 你會每天歸檔這些事實嗎?

即,您希望能夠查找5天前暫停的訂單,還是僅查看與當前日期相關的150個問題中的所有數據?

你可以有一個150列的表,每個問題一個表。如果您要存檔數據並且每天需要一條記錄,則這可能很有意義。

另一種方法是創建一個訂單事實表只有兩個或三個字段:

Fact_Name  VARCHAR2(30) 
Order_Fact  NUMBER(10,2) 
Last_Update_Date DATE 

你的Oracle存儲過程將查詢和更新一次的事實之一:

insert into ORDER_FACTS 
select "ORDERS_RECEIVED" fact_name, count(*) order_fact, sysdate 
from ORDER_TABLE 
where rcv_date = trunc(sysdate); 

commit; 

如果你只想保持一個記錄每個事實,你會做一個更新。

如果您的某些問題的答案不是數字,您可能需要爲VARCHAR2類型的事實保留一個單獨的表。

如果你喜歡這個解決方案的聲音,我可以明天設置一個示例程序。

編輯:

既然你存儲的數據價值的30天內,我將創建的日期詳細程度表,並有1列來存儲每個結果。對於我的例子,我只包含3列,這樣你就可以得到這個想法。首先,創建表來保存您的訂單事實。

create table order_facts 
(DT    DATE, 
    ORD_RCV   NUMBER, 
    SAME_DAY_SHIPPED NUMBER, 
    ON_HOLD   NUMBER); 

我建議DT字段只存儲日期。這將使表格更容易與日曆表連接,如果日曆表基於具有星形模式中的日曆的表格,則可以輕鬆地將這些事實連接到其他報表。

接下來,創建過程來更新他們:

CREATE OR REPLACE PROCEDURE CALC_ORDER_FACTS (iDate date := trunc(sysdate), iPurgeDays number := 0) 
IS 
    ddate DATE; 
    dummy DATE; 
/* 
     Calc_order_facts 
     Date   Author Note 
     04/11/2013 XXX  Created this procedure 

    Param iDate (optional, default trunc(sysdate) 
    Specify Date to calculate order facts for 

    Param iPurgeDays number (optional, default 0) 
    Specify how many days to retain data. Data older than iPurgeDays will be deleted. 
    If 0, purging is disabled. 

*/ 

BEGIN 
    ddate := iDate; 

    IF iPurgeDays > 0 THEN 
     dbms_output.put_line('Purging data more than ' || to_char(iPurgeDays) || ' days old.'); 
     begin 
      delete ORDER_FACTS 
      where DT < trunc(ddate-iPurgeDays); 
      commit; 
     EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
      dbms_output.put_line('Purge found no data.'); 
     WHEN OTHERS THEN 
      -- Consider logging the error and then re-raise 
      dbms_output.put_line('Purged failed, rollling back...');    
      rollback; 
     END; 
    END IF; 

    -- If date does not already exist in table, insert it 
    begin 
     select dt 
     into dummy 
     from order_facts 
     where dt = ddate; 
    EXCEPTION 
    WHEN NO_DATA_FOUND THEN 
     insert into order_facts 
     values (ddate, null, null, null); 
     commit; 
    END; 

    -- ORD_RCV 
    -- Calculate Orders received 
    update order_facts 
    set ord_rcv = 
     (select count(*) ord_rcv 
     from ORDER_TABLE 
     where rcv_date = ddate) 
    where dt = ddate; 
    commit; 

    -- SAME_DAY_SHIPPED 
    -- Calculate Orders received and shipped on ddate 
    update order_facts 
    set same_day_shipped = 
      (select count(*) same_day_shipped 
      from order_table 
      where rcv_dt = ddate 
      and ship_dt = ddate) 
    where dt = ddate; 
    commit; 

    -- ON_HOLD 
    -- Total orders on_hold 
    -- This method applies if you are only concerned with total on hold 
    update order_facts 
    set on_hold = 
      (select count(*) ON_HOLD 
      from order_table 
      where status = 'HOLD') 
    where dt = ddate; 
    commit; 

END CALC_ORDER_FACTS; 
+0

感謝您的回覆,我將不得不進行30天的計算,因此計劃將在第1天執行計算,並在執行時將等於SYSDATE的列添加到時間戳。這將允許我在第2天進行計算,並在交叉表查詢中顯示兩天。 – RNORRIS 2013-04-10 12:06:02

+0

只是爲了闡明,報告是交叉表查詢的集合,其中水平值是執行計算的日期。所有計算都與跟蹤業務單位績效的日期相關。此報告一次將顯示30天的數據。 – RNORRIS 2013-04-10 12:20:05

+0

答案中增加了步驟。 – Damienknight 2013-04-11 20:20:13

相關問題