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.
修改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
重新查看试图查看器:
这个时候synthetic key消失了。
这个时候Sales表里包含了两个表的信息,但是他们是在不同的行。
注意:
1,当两个事实表共享同样的相同个数的(key set)键集合的时候,concatenation应该是首选方案去避免qlikview自动的创建synthetic key.
2,concatenate 相当于把两个小表合并成一个大表,此大表包含2个表的所有子段列,和所有的行信息。同时做了横向和纵向的扩展。
3,QIikview 在做计算的时候是直接忽略null值的。即在qlikview的表达式里存在NULL的行做运算的时候,qlikview直接忽略它,其他的非NULL的值可以做运算。但是在SQL SERVER里如果有NULLL的参与运算的时候,结果肯定是NULL。