在 Oracle 中填充事实表

Posted

技术标签:

【中文标题】在 Oracle 中填充事实表【英文标题】:Populationg the Fact table in Oracle 【发布时间】:2018-04-03 11:17:57 【问题描述】:

我是维度建模的新手,因为有点卡住了。场景是“公司”已将其假期保险和疾病保险的填写外包给他们填写的代理机构,每次填写的会议称为轮班。我有一个如下的 4 个维度表。为简单起见,我只包括了一个每个行。我正在使用 sql developer。

公司维度-包含公司分支机构的所有详细信息

BranchId|BranchName|Postcode|County
12      |Kensington|rt5gg   |newengland

Shift_worker 维度- 包含所覆盖的轮班工人的所有详细信息

worker_id|worker_name|phone
33       |Steve Smith|07766755543

Shift_request 维度- 包含公司向代理机构提出的请求的所有详细信息

Request_id|Branch_id
1221      |12

时间维度

time_id|week_num|day_of_the_week|quarter_num|weekend_flag|Year
221    |3       | 3             |2          |N           |2014

最后是移位表,事实表将从中读取

shift_date |shift_status|shift_id|request_id|worked_hours|type
------------------------------------------------------------------
 09-01-2011|Filled      |8899    |1221      | 2          |cleaner  
21-01-2011 |Cancelled   |6677    |1332      | 0          |Admin_assistant

我已经创建了一个如下的事实表

CREATE TABLE "FACT_company" 
   (    "FACT_ID" NUMBER, 
    "TIME_ID" NUMBER, 
    "BRANCH_ID" NUMBER, 
    "WORKER_ID" NUMBER, 
    "REQUEST_ID" NUMBER, 
    "SHIFT_ID" NUMBER, 
    "WORKED_HOURS" NUMBER, 
    "TYPE" VARCHAR2(30 BYTE), 
    "SHIFT_STATUS" VARCHAR2(30 BYTE)
   ) SEGMENT CREATION DEFERRED 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  TABLESPACE "COMPANY" ;

如何在 PL/SQL 中使用游标填充这个事实?我的目标是事后分析数据,找出每个月取消了多少班次,每个季度填补了多少班次等。我希望我走在正确的道路上。

【问题讨论】:

您似乎没有任何东西可以将 Worker 与 Shift 联系起来。 【参考方案1】:

我在shift_table 中添加了两列WorkerId inttimeId int,并在以下策略中使用适当的值填充它们:

SQL> create table Company_dimension( BranchId int, BranchName varchar2(50), Postcode varchar2(15), County varchar2(50));
SQL> insert into Company_dimension values(12,'Kensington','rt5gg','newengland');

SQL> create table Shift_worker_dimension( worker_id int, worker_name varchar2(50) , phone varchar2(15) );
SQL> insert into Shift_worker_dimension values(33,'Steve Smith','07766755543');

SQL> create table Shift_request_dimension( Request_id int, Branch_id int);
SQL> insert into Shift_request_dimension values(1221,12);

SQL> create table Time_dimension( time_id int, week_num int, day_of_the_week int, quarter_num int, weekend_flag varchar2(1),Year int );
SQL> insert into Time_dimension values(221,3,3,2,'N',2014);

SQL> create table Shift_table( shift_date date, shift_status varchar2(25), shift_id int, request_id int, worked_hours int, type varchar2(25), WorkerId int, timeId int );
SQL> insert into shift_table values(to_date('09-01-2011','dd-mm-yyyy'),'Filled',8899,1221,2,'cleaner',33,221);  
SQL> insert into shift_table values(to_date('21-01-2011','dd-mm-yyyy'),'Cancelled',6677,1332,0,'Admin_assistant',null);

SQL> create table fact_company(FACT_ID NUMBER, TIME_ID NUMBER, BRANCH_ID NUMBER, WORKER_ID NUMBER, REQUEST_ID NUMBER, SHIFT_ID NUMBER, WORKED_HOURS NUMBER, TYPE VARCHAR2(30 BYTE), SHIFT_STATUS VARCHAR2(30 BYTE) );

SQL> create sequence seq_fact start with 1;

SQL> insert into fact_company
select seq_fact.nextval,
       td.time_id, 
       cd.branchid, 
       sw.worker_id, 
       sr.request_id, st.shift_id, st.worked_hours, st.type, st.shift_status
  from Shift_table st 
  join Shift_request_dimension sr on (sr.request_id = st.request_id)  
  join Company_dimension cd on ( sr.branch_id = cd.branchid )
  join Shift_worker_dimension sw on (sw.worker_id = st.workerid)
  join Time_dimension td on (td.time_id = st.timeid);

SQL> commit;

【讨论】:

@dwalker 你也一样。

以上是关于在 Oracle 中填充事实表的主要内容,如果未能解决你的问题,请参考以下文章

Oracle——星型查询

Oracle 11g - 使用序列中的常量值填充表行

如何从oracle中的另一个表中填充空列?

Oracle 从多个表更新

当嵌套表属于记录类型时,如何将数据填充到 Oracle 中的嵌套表中

oracle数据库,怎么给已有很多数据的表填充自增序列字段