【问题标题】:Building a data analysis report with Oracle and Report Studio使用 Oracle 和 Report Studio 构建数据分析报告
【发布时间】:2013-04-12 04:19:26
【问题描述】:

我已经使用此站点上的信息有一段时间了,现在有一个大型项目需要您的一些专业知识。我在 Oracle 11g 环境中工作,并且还拥有 Cognos Report Studio 10.1

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

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

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

【问题讨论】:

  • 这些值多久更改一次?报告中的数据必须是多长时间?如果数据有点过时是可以接受的,那么预先计算数据是非常标准的。
  • 这些数据计算代表了生产一天内的交易和订单变化,它将保存一个月的数据。因此,除了当前日期之外,报告每天都需要填充过去的数据。

标签: oracle11g cognos


【解决方案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;

【讨论】:

  • 感谢您的回复,我将不得不保留 30 天的计算,因此计划是在第 1 天执行计算,并在执行计算时将等于 SYSDATE 的列添加到时间戳。这将允许我在第 2 天进行计算并在交叉表查询中显示这两天。
  • 澄清一下,报告是交叉表查询的集合,其中水平值是执行计算的日期。所有计算都与跟踪业务部门绩效的日期相关。此报告将一次显示 30 天的数据。
  • 在答案中添加了程序。
  • 你的例子非常好,我没想到用当前日期创建一行然后更新属性。这似乎是一个可靠的解决方案。我将尝试将清除设置为识别月份变化的功能,然后在删除和开始新月份之前将事实表中的数据保存到平面文件中。感谢您的帮助。
  • 这听起来像是一个很棒的净化解决方案。我建议使用日历表来简化您的清除逻辑。如果您要离开会计日历,这将非常重要。
猜你喜欢
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
相关资源
最近更新 更多