Qlikview Data Modeling---创建一个Key/Link Table

这一篇我们将来学习下在什么情况下需要在QlikView里创建一个Key或者Link Table来避免事实表loops 和 qlikview自动产生synthetic keys。当两个事实表共享同样的键集合的时候,concatenation应该是首选方案去避免qlikview自动的创建synthetic key. 然而,如果一个事实表的比另外一个事实表的key键多,而且多出的key键值和另外一个事实表没有关联,这个时候创建一个key table去连接这些键值的方案就更加适合。


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
];

Budget:
LOAD * INLINE [
StoreID, ProductID, BudgetQty, BudgetValue
1, 1, 5, 50
1, 2, 6, 47
2, 1, 5, 41
2, 2, 4, 27
];

加载数据后,查看Data Model 如下:

Qlikview Data Modeling---创建一个Key/Link Table_第1张图片

从上面可以看出,QLIKVIEW帮我们自动产生了一个synthetic key named $Syn1 includes ProductID and StoreID. Budget和Sales两个表同时共享一个$Syn1,但是Sales事实表比Budget事实表多一个key named DateID. 所以这种情况下用concatenate不太适合。

这个时候我们可们可以为Sales和Budget表创建一个键字段 (key filed),它包含两个表的共同的键字段。如下所示:

第一步:为Sales和Budget表创建一个键字段 (key filed),它包含两个表的共同的键字段

Sales:
LOAD
AutoNumberHash256(StoreID, ProductID) As SalesBudgetID,
*
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
];

Budget:
LOAD
AutoNumberHash256(StoreID, ProductID) As SalesBudgetID,
*
INLINE [
StoreID, ProductID, BudgetQty, BudgetValue
1, 1, 5, 50
1, 2, 6, 47
2, 1, 5, 41
2, 2, 4, 27
];

第二步:通过Sales表的数据创建一个key table

Key:
Load Distinct
SalesBudgetID,
StoreID,
ProductID
Resident
Sales;

第三步: 和Budget表所有匹配的记录进行连接Join

Join (Key)
Load Distinct
SalesBudgetID,
StoreID,
ProductID
Resident
Budget;

 第四步:删除Sales和Budget表里的已经在Key Table里的字段
// These fields are no longer needed in the fact tables
Drop Fields StoreID, ProductID From Sales;
Drop Fields StoreID, ProductID From Budget;

第五步:Reload the script.此时的Data Model如下图:

Qlikview Data Modeling---创建一个Key/Link Table_第2张图片

Now that the synthetic key is gone.


Note:
1,这里的Join Load,是full outer join,他能包含两个表里的所有可能的值到key table.所有的在product 或则 store表里的选择任然可以正确的关联到Sales和Budget事实表上。其中的load里的distinct字句是保证只有唯一的值才被添加到key table里。
2,AutoNumberHash265是一个可以为相同的信息组合返回同样的一个整型值。如果是想把好几个值转换成一个整型的值的话,这个函数就可以做到。你需要注意的是该函数只能保证在同一个load script里返回同样的值。在不同的load script里就不能保证了。

3,当然这个例子我们完全可以用concatenate来处理,上面只是在什么情况下和如何使用key/link table.

4,用concatenate处理如下:


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
];


//Budget:
Concatenate (Sales)
LOAD
*
INLINE [
StoreID, ProductID, BudgetQty, BudgetValue
1, 1, 5, 50
1, 2, 6, 47
2, 1, 5, 41
2, 2, 4, 27
];


Data Model如下图:

Qlikview Data Modeling---创建一个Key/Link Table_第3张图片

当然此data model也是没有synthetic key的。






你可能感兴趣的:(JOIN,table,load,QlikView,keylink)