这篇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.
修改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。