2013-04-09 1 views
1

본 사이트에 대한 정보를 잠시 사용했으며 지금은 전문성이 필요한 대형 프로젝트가 있습니다. 저는 Oracle 11g 환경에서 근무하며 Cognos Report Studio 10.1도 보유하고 있습니다.Oracle 및 Report Studio로 데이터 분석 보고서 작성

부서의 아웃 바운드 주문 분석을 표시하는 멀티탭 보고서를 작성하고 있습니다. 약 30 개의 데이터 열을 보유하는 사용자 지정 테이블을 만들었습니다. 여기에서 매일 150 개 이상의 계산을 수행해야합니다. 이 계산의 예는
입니다. 1) 오늘받은 주문 수는 얼마나됩니까?
2) 오늘받은 주문 중 몇 개가 당일 배송 되었습니까?
3) 얼마나 많은 주문이 보류 중입니까?

기본적으로 코어 테이블에서 4-5 개의 라인 쿼리가 100 개 있습니다. 두 번째 테이블을 만들고 WITH 절을 사용하여 프로 시저에서 계산을 수행하고 테이블에 삽입하는 방법에 대해 생각해 보았습니다.

질문에 도달하려면 누구나 많은 양의 계산을 수행하는 프로 시저/패키지를 작성하고 제안 할 수있는 링크/웹 페이지가 있습니까? 내 검색을 통해이 자연에 대한 보고서의 예가 만들어지지 않았으며 가능하면 최대한 효율적으로 접근하고 싶습니다. 모든 정보/리소스에 미리 감사드립니다.

+0

얼마나 자주이 값은 변경합니까? 보고서의 데이터는 얼마나 최근에 있어야합니까? 조금 오래되었다고 받아들이면 데이터를 사전 계산하는 것이 꽤 표준 적입니다. –

+0

이러한 데이터 계산은 생산 당일의 거래 및 주문 변경을 나타내며 1 개월 분의 데이터를 보유하게됩니다. 따라서 매일 보고서는 현재 날짜 이외에 과거 데이터를 채워야합니다. – RNORRIS

답변

1

테이블과 저장 프로 시저를 사용하는 것이 좋습니다. 몇 가지 고려 사항 : 하루에 이러한 사실을 보관할 예정입니까?

예, 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; 
+0

답장을 보내 주셔서 감사합니다. 30 일 분량의 계산을 수행해야 계획에서 1 일째 계산을 수행하고 SYSDATE와 동일한 열을 수행 할 때 타임 스탬프에 추가해야합니다. 이것은 제가 2 일째에 계산을하고 크로스 탭 쿼리에서 두 날을 모두 표시 할 수있게하는 것입니다. – RNORRIS

+0

명확히하기 위해 보고서는 가로 값이 계산이 수행 된 날짜 인 크로스 탭 쿼리 모음입니다. 모든 계산은 비즈니스 단위의 성과를 추적하는 날짜와 관련이 있습니다. 이 보고서에는 한 번에 30 일 분량의 데이터가 표시됩니다. – RNORRIS

+0

답변에 절차가 추가되었습니다. – Damienknight