天天看點

Qlikview Data Modeling---Concatenation

 這篇Blog主要介紹下通過Concatenation(串聯) 事實表來避免loops 和 synthetic keys:

Qlikview裡的模組化通常都是是很簡單的。通常我們隻要重新命名一些子段的名字來防止或者建立表之間的自動關聯。

但是有時候我們隻是通過簡單的重命名是解決不了問題的。例如我們有多個事實表和其他的表有多個關聯,這樣通常會産生可怕的

synthetic key,更可怕的是會産生data loop(閉環).Qlikview的data modeling千萬不能有data loop。

要建立一個好的資料模型在Qlikview裡是和通常的關系型資料庫模組化是有很大的差別的。用QLIKVIEW進行建立模型和次元模型很相似。根據資料的複雜性,有時候需要用混合型的模組化方法。當然QLIKVIEW是很支援此類模組化的。

今天我們來一起見證下Qlikview是如何處理這類複雜的關聯的。

Concatenation of fact tables to avoid loops and synthetic keys

下面是一個例子 :

Store:

Load * Inline [

StoreID, StoreName

1, Store A

2, Store B

];

Calendar:

Load MonthID As DateID, Month Inline [

MonthID, Month

1, Jan

2, Feb

];

Product:

Load * Inline [

ProductID, Product

1, Product A

2, Product B

];

Sales:

LOAD * INLINE [

DateID, StoreID, ProductID, SaleQty, SaleValue

1, 1, 1, 2, 23

1, 1, 2, 4, 24

2, 1, 1, 4, 33

2, 1, 2, 3, 28

1, 2, 1, 2, 21

1, 2, 2, 4, 30

2, 2, 1, 3, 25

];

Waste:

LOAD * INLINE [

DateID, StoreID, ProductID, WasteQty, WasteValue

1, 1, 1, 1, 10

2, 1, 2, 1, 9

1, 2, 2, 2, 17

2, 2, 2, 1, 8

];

從下面的資料模型架構可以看出qlikview為我們自動産生了一個 synthetic key.從下面的圖可以看出Sales和Waste共享同樣的key set(StoreID,DateID,ProductID). 這種情況我們就可以通過concatenate去消除此key set.

Qlikview Data Modeling---Concatenation

修改waste表的加載方式如下:

//Waste:

Concatenate (Sales)

LOAD * INLINE [

DateID, StoreID, ProductID, WasteQty, WasteValue

1, 1, 1, 1, 10

2, 1, 2, 1, 9

1, 2, 2, 2, 17

2, 2, 2, 1, 8

];

Reload  the Script

重新檢視試圖檢視器:

Qlikview Data Modeling---Concatenation

這個時候synthetic key消失了。

Qlikview Data Modeling---Concatenation

這個時候Sales表裡包含了兩個表的資訊,但是他們是在不同的行。

注意:

1,當兩個事實表共享同樣的相同個數的(key set)鍵集合的時候,concatenation應該是首選方案去避免qlikview自動的建立synthetic key.

2,concatenate 相當于把兩個小表合并成一個大表,此大表包含2個表的所有子段列,和所有的行資訊。同時做了橫向和縱向的擴充。

3,QIikview 在做計算的時候是直接忽略null值的。即在qlikview的表達式裡存在NULL的行做運算的時候,qlikview直接忽略它,其他的非NULL的值可以做運算。但是在SQL SERVER裡如果有NULLL的參與運算的時候,結果肯定是NULL。