表和存儲過程是一個好主意。一些注意事項: 你會每天歸檔這些事實嗎?
即,您希望能夠查找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;
的頻率有多這些值的變化?你的報告中的數據最近有多久?如果可以接受的話,預先計算數據是相當標準的。 – 2013-04-12 09:04:14
這些數據計算表示生產當天的交易和訂單變化,它將保存一個月的數據。因此,除了當前日子以外,每天都需要填寫過去的數據。 – RNORRIS 2013-04-12 11:25:34