今天博客的主题是:参数联动解决方案。
环境:数据仓库+OLAP(立方体)+Reporting Service。达到的效果:多个参数(1,2,……)达到互相联动效果。
先说下原理,数据仓库由事实表和维度构成,我理解的事实表其实就是与一个主题相关的多个维度以及度量这些维度的值组成的一张表。而维度就是一本字典。当你从事实表中读取一条记录时,就要从字典总以不同角度翻看查找对应的解意、造句等,而这些就是属性。一个维度其相关的任何有意义的属性都能够存入其中(当就包括那些主外键)。
那么参数要怎么级联呢?那当然是要有关系咯,当你选定部门参数后,只希望物料参数出现和他相关的那几个参数集合。这就是关系,从SQL理解,就是where后面那些个嵌套select语句,IN条件等的筛选条件。
第一个解决方式:参数来自于同一个维度的级联。看下面这个BLOG,作者已经很清楚的讲解了整个构建过程。
http://www.cnblogs.com/PumpkinDatabase/archive/2009/09/29/1576151.html
从MDX看出,各个参数对应的参数集之所以级联就是那个From{@参数} on Columns,他所代表的意义就如同SQL中Where这一抹红,呵呵就是筛选条件啦。恩,接下来扩展扩展思维,那如果又加入一个参数,且这个参数是来自另一个维度,怎办哩?
第二个解决方式:建立属性关系。原理还是:关系!既然你把一个维度中三个字段作为三个参数级联,那么同理你也可以将另一个维度做主外键后,冗余一个字段,成为三个参数中的一员咯。
具体实现方法是:修改上述的物料参数对应的维度表结构,加入部门维度的Key作为外键和甲维度关联.再在立方体中加入物料、部门维度的表关系和“属性关系”。图:
这时,事实表与物料关联,物料与部门关联。在Reporting Service中构建数据集时,展开物料维度,同第一个解决方式中,将物料维度中的物料和部门拖入到筛选栏中,作为筛选条件并勾选为参数。
那你发现其中有什么问题么?其一,要动表结构,很烦很很烦,要重新思考表结构、做抽取等等。第二,参数都是来自于维度,会产生当选择某参数值后,报表无数据显示的情况。第三,当其需要联动其他维度做参数时,而维度之间又没有必然关系,那又该肿么办呢?
第三个解决方式(终极了,耐心哦,我也快写不动了,不过又很兴奋的想赶快告诉你)。原理:还是关系!不过这次,我们把目光放远一点,你要的参数们,他们最终会在一个地方落脚,那就是事实表中。也只有在事实表中,他们通过度量值才建立了各种关系。那好,有了上面的基础。我们这么做:
1、在Analysis services工程项目中,新构建一个事实维度,起名参数维度。在“数据源视图中”,加入事实表,以及要关联的维度。
2、从数据源视图中,将事实表中需要建立为参数的那些维度字段,添加到该维度的属性中。例如:选中新加入的Item(物料)这个属性成员,找到他属性中KeyColumns,检查是否对应事实表的ItemKey,以及NameColumns对应DimItem中ItemName。其他属性成员复制该方法。
3、如果参数要显示有层级结构,那在加入属性成员时,就多冗余一个ParentKey,也同样修改它的NameColumns。
4、将该维度添加到Cube中。部署即可。
容易出错的地方:这个维度生成时,我一再强调KeyColumns要对应事实表的Key,如果加入的是维度的Key,那在添加到Cube时,就会再次加入一个相同的维度。
这样实现结果:上面三个参数就互相级联咯:),而且不会出现无数据显示的情况。
在此要非常感谢群里面耐心给予我指导的各位朋友~虽未谋面,但感谢你们的诚恳对待:)