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帮我们自动产生了一个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如下图:
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如下图:
当然此data model也是没有synthetic key的。