QlikView Script 基礎教程3 -組合鍵處理

askyer2006發表於2009-02-03

QlikView裝載資料時,如果有兩個或以上表中存在兩個或以上相同的欄位時就會自動產生組合鍵。

組合鍵實際上是產生了表間的多對多關係,這種關係邏輯上可能是對的。組合鍵會引起QlikView效能隱患,儲存所有出現的組合值,在資料量很大時會消耗太多的記憶體。組合鍵越多Qlikview的執行效能下降越厲害,百萬級資料量情況下如果4-5個組合鍵,系統可能執行都成問題。

如何處理出現的組合鍵呢?

Case1:源資料表中組合的欄位並不具有邏輯的組合含義,採用重新命名方式解決[@more@]

例如:

訂單:

Load

訂單號,訂單日期,訂單金額,操作員,操作時間

From Db.Sales;

訂單明細:

Load

訂單號,產品號,產品數量,產品單價,操作員,操作時間

From Db.SalesDetails;

如果QlikView直接裝載會產生“訂單號、操作員,操作時間”這三個欄位的組合鍵。再細看一下,訂單和訂單明細表中都有操作員、操作時間兩個欄位,而這兩個欄位對沒有邏輯上的關聯,因此可以Rename該欄位名稱。

修改如下:

訂單:

Load

訂單號,訂單日期,訂單金額,操作員 as訂單_操作員,操作時間 as訂單_操作時間

From Db.Sales;

訂單明細:

Load

訂單號,產品號,產品數量,產品單價,操作員 as 訂單明細_操作員,操作時間as 訂單明細_操作時間From Db.SalesDetails;

如果重複的欄位較多,則可以採用Qualify關鍵字。寫法如下:

Qualify 操作員,操作時間;

訂單:

Load

訂單號,訂單日期,訂單金額,操作員,操作時間

From Db.Sales;

訂單明細:

Load

訂單號,產品號,產品數量,產品單價,操作員,操作時間

From Db.SalesDetails;

或者

Qualify *;

訂單:

Load

訂單號,訂單日期,訂單金額,操作員,操作時間

From Db.Sales;

訂單明細:

Load

訂單號,產品號,產品數量,產品單價,操作員,操作時間

From Db.SalesDetails;

Unqualify *;

Qualify關鍵字支援?,*等萬用字元。

Case2:源資料中邏輯上存在多對多的組合鍵,可以採用建立Key進行處理

例如:

訂單明細:

Load

訂單號,產品號,產品數量,產品單價,操作員,操作時間

From Db.SalesDetails;

採購單:

訂單號,產品號,銷售商號,採購時間,採購數量,採購單價

From Db.Supply;

訂單號,產品號在訂單明細和採購單兩表中邏輯上存在多對多關係,這時可以採用建立一個新的鍵值來表示:

訂單明細:

Load

訂單號,產品號,

訂單號&’-’&產品號 as SupplyKey,

產品數量,產品單價,操作員,操作時間

From Db.SalesDetails;

採購單:

訂單號&’-’&產品號 as SupplyKey,

,銷售商號,採購時間,採購數量,採購單價

From Db.Supply;

有時組合鍵很長,這樣也會多耗費Qv的記憶體,可以進一步最佳化:

AutoNumber(訂單號&’-’&產品號) as SupplyKey產生組合鍵值

AutoNumber會根據“訂單號&’-’&產品號”不同產生唯一的數值。該函式的缺點就是不能用於增量資料裝載的環境中,因為AutoNumber每次裝載會重新編號。

要解決這個問題,Qv8提供了Hash128()函式,寫法如下:

Hash128(訂單號&’-’&產品號) as SupplyKey

Case2:源資料中邏輯上存在多對多的組合鍵,組合欄位較多,可以採用合併大表的方式解決

例如:

XXX:

Load

A,B,C,D,E,F

From Db.xxx;

YYY:

Load

A,B,C,D,H,I

From Db.YYYY;

XXXYYY表中都有A,B,C,D欄位,可以考慮組合成大表的方式解決,採用Concatenate關鍵字:

XXX:

Load

A,B,C,D,E,F

From Db.xxx;

Concatenate

Load

A,B,C,D,H,I

From Db.YYYY;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10158957/viewspace-1016623/,如需轉載,請註明出處,否則將追究法律責任。

相關文章