테이블과 저장 프로 시저를 사용하는 것이 좋습니다. 몇 가지 고려 사항 : 하루에 이러한 사실을 보관할 예정입니까?
예, 5 일 전에 보류중인 주문을 조회 할 수 있도록 하시겠습니까, 아니면 150 개 질문 중 현재 날짜와 관련된 모든 데이터입니까?
각 질문마다 하나씩 150 개의 열이있는 표를 만들 수 있습니다. 데이터를 보관하고 하루에 하나의 레코드가 필요한 경우 이는 의미가 있습니다.
대안은 두 개 또는 세 개의 필드로 주문 팩트 테이블을 만드는 것입니다 :
Fact_Name VARCHAR2(30)
Order_Fact NUMBER(10,2)
Last_Update_Date DATE
오라클 저장 프로 시저 쿼리 한 번에 사실 하나 업데이트 할 것입니다 :
insert into ORDER_FACTS
select "ORDERS_RECEIVED" fact_name, count(*) order_fact, sysdate
from ORDER_TABLE
where rcv_date = trunc(sysdate);
commit;
하는 경우를 사실 하나당 하나의 기록을 유지하고 싶다면 업데이트를해야합니다.
일부 질문에 대한 대답이 숫자가 아닌 경우 VARCHAR2 유형의 사실에 대해 별도의 테이블을 유지해야 할 수도 있습니다.
이 솔루션의 사운드가 마음에 드시면 내일 예제 절차를 설정할 수 있습니다.
편집 :
는 데이터 30 일 가치가 저장되어 있기 때문에, 나는 날짜 세부 수준에서 테이블을 생성하고, 각각의 결과를 저장 한 열을 가질 것이다. 나의 예를 들어, 나는 단지 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;
얼마나 자주이 값은 변경합니까? 보고서의 데이터는 얼마나 최근에 있어야합니까? 조금 오래되었다고 받아들이면 데이터를 사전 계산하는 것이 꽤 표준 적입니다. –
이러한 데이터 계산은 생산 당일의 거래 및 주문 변경을 나타내며 1 개월 분의 데이터를 보유하게됩니다. 따라서 매일 보고서는 현재 날짜 이외에 과거 데이터를 채워야합니다. – RNORRIS