繁体   English   中英

在Oracle中填充事实表

[英]Populationg the Fact table in Oracle

我对尺寸建模是陌生的,有点卡住了。 场景是“公司”将其假期保险和疾病保险的填写工作外包给了他们填补的一家代理公司,每次填补的工作都称为轮班。我有一个如下的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中使用游标填充此事实? 我的目的是分析之后的数据,以找出每个月取消了多少班次,每个季度填补了多少班等。我希望我走对了方向。

我在shift_table添加了两列, shift_tableWorkerId inttimeId int并在以下策略中timeId 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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM