在上一節時,我們建立了一個基於部門號的工資分類匯總。 這裡就引出了一個概念:維度
專業的解釋大家自行百度,這裡就不班門弄斧了。從資料的使用角度看,維度可以簡單的理解成“資料分類匯總的一種依據”。
按“部門號(DEPTNO)”對“工資(SAL)”進行分類匯總,“DEPTNO"就是一種維度;按“工作崗位(JOB)”對“工資”進行分類匯總,“JOB”就是另一種維度;
維度之間也可以有層次關係,比如:我們先按“工作崗位” 匯總,然後每個相同工作崗位的員工,再按“部門”匯總。這種情境下:DeptNo就認為是Job的子級維度。
先按Job摘要資料,相同Job的,再按DeptNo做更詳細的資料匯總,這種逐層深入的資料分析過程,在BI層裡有一個專業術語:切入(Drill).
下面就剛才的情境(即:按JOB -> DEPTNO來層層對SAL進行分類匯總),來看看維度如何建立:
一、db表結構的建立
通過上回的學習,大家應該有一個大概印象,每種資料分類的依據,我們應該建立一張小表來與之對應(比如按部門號匯總時,DEPT部門表就認為是一張維度資料表)
現在我們要通過JOB、DEPTNO 這二個有層級的維度對資料進行分析,所以:得有二張表。
動手之前,插點題外話:通常對資料進行分析比較消耗db效能(特別是複雜的分析),所以一般真正的BI分析,都會事先把資料抽取到另一張表(甚至另一個專用於BI分析的庫),這樣分析時,不至於影響正常的生產系統使用。
這裡我不想對資料幫浦展開討論(事實上,這一塊我還沒學會~_~),但是為了體現這個思想,我們建立幾張以“BI_”為首碼的新表來作為BI分析的資料來源。
create table BI_DIM_JOB as select distinct(job) from emp;create table BI_DIM_DEPT as select deptno,dname from dept;
這樣就建立了二張小表BI_DIM_JOB、BI_DIM_DEPT以對應JOB、DEPT二個維度,但通常表還得有主鍵:
alter table BI_DIM_JOB add constraint PK_BI_DIM_JOB primary key (JOB);alter table BI_DIM_DEPT add constraint PK_BI_DIM_DEPT_DEPTNO primary key (DEPTNO);
加上主鍵後,我們再來看下主表EMP,既然JOB、DEPTNO都準備用單獨的小表記錄,主體表中就不再需要這些欄位了,我們只是想對SAL進行分析,所以我們把EMP主表也做下處理:
create table BI_FACT_EMP as select empno,sal from emp;alter table BI_FACT_EMP add constraint PK_BI_FACT_EMP primary key (EMPNO);
這樣就得到了一張新的(事實)主表,做為BI的事實表資料來源。
哦,仔細看了一下:這張表裡沒有ENAME(員工姓名),乾脆,把EMPNO也當成一個維度,獨立出來吧:
create table BI_DIM_EMP as select empno,ename from emp;alter table BI_DIM_EMP add constraint PK_BI_DIM_EMP_EMPNO primary key (EMPNO);
看到這裡,可能已經有人發現了一個重大的問題:主表BI_FACT_EMP與這些小表之間好象沒有任何資料上的關聯關係?
看來,還少一張用於描述EMPNO與JOB、DEPTNO之間關係的表:
create table BI_DIM_DRILL_EMP as select job,deptno,empno from emp group by job,deptno,empno order by job,deptno,empno;alter table BI_DIM_DRILL_EMP add constraint PK_DIM_DRILL_EMP_EMPNO primary key (EMPNO);alter table BI_DIM_DRILL_EMP add constraint FK_DIM_DRILL_EMP_REF_JOB foreign key (JOB) references bi_dim_job (JOB);alter table BI_DIM_DRILL_EMP add constraint FK_DIM_DRILL_EMP_REF_DEPTNO foreign key (DEPTNO) references bi_dim_dept (DEPTNO);alter table BI_DIM_DRILL_EMP add constraint FK_DIM_DRILL_EMP_REF_EMPNO foreign key (EMPNO) references bi_dim_emp (EMPNO);alter table BI_FACT_EMP add constraint FK_BI_FACT_EMP_REF_EMPNO foreign key (EMPNO) references bi_dim_drill_emp (EMPNO);
好了,天下太平,主表BI_FACT_EMP 與 從表 BI_DIM_DRILL_EMP 通過EMPNO關聯,而 BI_DIM_DRILL_EMP 再進一步通過EMPNO、JOB、DEPTNO分別與BI_DIM_EMP、BI_DIM_JOB、BI_DIM_DEPT關聯,完全符合資料庫範式。
光看上面的sql指令碼,比較容易暈,為了更直觀的說明各表的關係,這裡給一張關係圖:
二、建立RPD 模型及維度
2.1、 先用“BI管理”工具,聯機開啟當前RPD,並把原來的對象全清空掉,再按前幾次學到的知識,把剛剛新建立的"BI_"打頭的表,全添加進來,弄好後,大概是下面這個樣子
注意圖中二個黃色的欄位:SAL_SUM、EMPNO_COUNT,這是我手動新添加的二個彙總欄位,SAL_SUM是對SAL的SUM彙總,而EMPNO_COUNT是對EMPNO的COUNT彙總,參見:
2.2、 在scott上右擊->建立對象-》邏輯維-》具有基於層級的層次的維
在彈出的介面中,輸入名稱:BI_EMP_DIMs
然後在BI_EMP_DIMs上右擊-》建立對象->邏輯層級
輸入EMPNO(即建立最底層的維度)
然後把BI_DIM_DRILL_EMP下的EMPNO拖動到剛建立的維度EMPNO下,如:
完成後,類似:
在EMPNO維度上右擊-》建立對象-》父層級
命名為DEPTNO
完成後,可以看到DEPTNO與EMPNO已經呈現出父子層次關係
同樣,把BI_DIM_DRILL_EMP中的DEPTNO拖動剛建立的維度DEPTNO上,如:
在DEPTNO維度上,再繼續建立父級維度JOB
同樣把BI_DIM_DRILL_EMP上的JOB拖動到新建立的維度JOB上,最終的維度層次如:
2.3、建立維度關鍵字:在JOB上右擊->建立邏輯層級關鍵字(如)
儲存預設,不作任何修改,直接點擊“確定”
類似的,在DEPTNO,EMPNO二個子級維度上,也建立關鍵字,然後點擊儲存,最終的樣子如:
註:儲存成功後,每個維度下的欄位前,會有一個類似“手*槍”的小表徵圖
2.4、把整個維度BI_EMP_DIMs拖動到【表示】層中的BI_FACT_EMP上,如:
如果這時點擊儲存,會彈出如下錯誤:
解決方案:在EMPNO上右擊-》屬性(如)
點擊+號
在彈出的介面中,展開SCOTT下的BI_DIM_DRILL_EMP表,雙擊EMPNO(即設定BI_DIM_DRILL_EMP的EMPNO欄位為維度EMPNO的顯示列)
類似的,把BI_DIM_DRILL_EMP的DEPTNO設定成維度DEPTNO的顯示列,把BI_DIM_DRILL_EMP的JOB設定成維度JOB的顯示列,再次點擊儲存,應該就能成功了。
模型和維度終於弄好了,已經成功80%,革命勝利在望!
三、建立切入分析
登入,切換到管理菜單,點擊“重新負載檔案和中繼資料”,以便讓剛才修改過的RPD生效
建立一個分析,從左側的主題地區裡,可以看到剛才建立的各種模型,我們選JOB和SAL_SUM、EMPNO_COUNT這三列,如:
切換到結果標籤,如,注意JOB欄位標題及該列資料,都以A連結的形式呈現,為了方便以後修改,這裡我們先儲存一下,檔案命名為SCOTT_EMP_DRILL,同時點擊工具列的小表徵圖(如),預覽下在儀錶盤中的效果
這是儀錶盤中的呈現效果,可以在JOB標題上點擊一下
這裡,BIEE會根據維度層次關係,自動“下鑽”到下一個維度(即DEPTNO),如:
DEPTNO維度下,還有最底層維度EMPNO,還可以繼續下鑽,如(注意一下每次切入後,SAL_SUM、EMPNO_COUNT這二列的值會自動更新)
當然,維度不止這一種玩法,還可以直接把整個維度放到分析結果中,如,如果雙擊BI_EMP_DIMs把整個維度加入所選列
為了美觀,我們把列名“漢化”一下
把欄位標題改成“工資”,其它幾列也類似處理
現在看起來舒服多了
可以點擊分組資料前的+號展開,這樣就以另一種類似樹狀的方式進行切入了
最後,為了讓分析結果看起來更fashion一點,給它加個動態圖表。不過做這個之前,有一個細節得先處理一下,“人數(EMPNO_COUNT)”是“個位元”層級的(<10),而“工資匯總(SAL_SUM)”是“千位元”層級的,如果二個條形柱顯示在同一張圖中,"人數"的柱狀圖高度幾乎接近於0,根本看不出來,所以有必要把“人數”的數值放大一些,以保持跟SAL_SUM接近(至少同一個數量級)
把人數放大1000位以後,結果看上去還比較滿意
下面是切入過程中,圖表動態變化的幾張:
下鑽到DEPTNO維度時的
下鑽到最底層EMPNO時的
截了近一天的圖,總算寫完了,希望對於正在學習oracle BIEE的朋友們有所協助