Oracle11g 使用Oracle和report Studio构建数据分析报告

Oracle11g 使用Oracle和report Studio构建数据分析报告,oracle11g,cognos,Oracle11g,Cognos,我使用这个网站上的信息有一段时间了,现在有一个大项目,我需要你的一些专业知识。我在Oracle 11g环境中工作,还拥有Cognos Report Studio 10.1 我正在构建一个multitab报告,该报告显示了一个部门的出站订单分析。我创建了一个自定义表,其中包含大约30列数据。从这里开始,每天必须在表上执行150多个计算。这些计算的一个例子是 1) 今天收到多少订单 2) 今天收到的订单中,有多少是当天发货的 3) 有多少订单被搁置 基本上是在核心表上进行100次4-5行查询。我考虑

我使用这个网站上的信息有一段时间了,现在有一个大项目,我需要你的一些专业知识。我在Oracle 11g环境中工作,还拥有Cognos Report Studio 10.1

我正在构建一个multitab报告,该报告显示了一个部门的出站订单分析。我创建了一个自定义表,其中包含大约30列数据。从这里开始,每天必须在表上执行150多个计算。这些计算的一个例子是
1) 今天收到多少订单
2) 今天收到的订单中,有多少是当天发货的
3) 有多少订单被搁置

基本上是在核心表上进行100次4-5行查询。我考虑过创建第二个表,并使用with子句,在一个过程中执行计算并插入到表中


为了回答这个问题,是否有人编写了执行大量计算的程序/程序包,是否有可以建议的链接/网页?我的搜索没有让我找到任何创建这种性质的报告的例子,我希望确保我的方法尽可能有效。提前感谢您提供的任何信息/资源。

一个表和存储过程是个好主意。一些考虑: 你会每天把这些事实存档吗

也就是说,您希望能够查找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天的数据,因此我将在日期详细信息级别创建表,并有一列存储每个结果。在我的例子中,我只包括了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;
创建或替换过程计算顺序事实(iDate日期:=trunc(sysdate),iPurgeDays编号:=0)
是
日期;
虚拟日期;
/*
计算顺序和事实
日期作者说明
2013年11月4日XXX创建了此程序
参数iDate(可选,默认trunc(sysdate)
指定计算订单事实的日期
参数iPurgeDays编号(可选,默认为0)
指定保留数据的天数。将删除早于iPurgeDays的数据。
如果为0,则禁用清除。
*/
开始
ddate:=iDate;
如果iPurgeDays>0,则
dbms|u output.put|u line('清除超过'| |到|字符(iPurgeDays)| |'天的数据');
开始
删除订单和事实
式中,DT
一个表和存储过程是个好主意。一些注意事项: 你会每天把这些事实存档吗

也就是说,您希望能够查找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天的数据,因此我将在