在Sql Server Analysis Service中维度上有多张表(大于一张表)时,一定要注意将第二张表开始用到维度属性中的KeyColumns下的NullProcessing要设置为UnknownMember,并且一定要将外层表(在表关联中被其它表指向的表就叫外层表)中和内层表(在表关联中指向其它表的表就叫内层表)关联的字段作为维度属性,并且在维度属性关系中要设置这个和内层表关联的属性来指向外层表中其它的属性。这是为什么呢?我们来看下面这个例子。

现在我们有一个维度叫V Fact ADT IPD Encounter,其中用到了两张表V_Fact_ADT_IPD_Encounter和V_Dim_MedicalGroup,其中第一张表V_Fact_ADT_IPD_Encounter和事实表通过字段Visit ID直接关联(维度用法常规),而第二张表V_Dim_MedicalGroup和表V_Fact_ADT_IPD_Encounter通过字段Medical Group Code关联从而间接和事实表产生关联,在维度中字段Visit ID、Patient Name来自第一张表V_Fact_ADT_IPD_Encoun,字段Medical Group Code、Medical Group Description来自第二张表V_Dim_MedicalGroup,所以本例中V_Fact_ADT_IPD_Encounter就是我们上面所说的内层表,V_Dim_MedicalGroup就是我们上面所说的外层表,整个维度的结构如下图所示:

现在如果内层表V_Fact_ADT_IPD_Encounter中有数据和外层表V_Dim_MedicalGroup中的数据关联不上,也就是说内层表V_Fact_ADT_IPD_Encounter中有几行数据的MedicalGroupCode字段和外层表V_Dim_MedicalGroup的MedicalGroupCode字段无法匹配,无法匹配的原因有如下两种:

  • MedicalGroupCode字段的值不为null,但是两张表的MedicalGroupCode字段值不匹配。这时在处理CUBE的时候会报KeyNotFound错误,出现这个错误的原因也很简单,因为维度中属性Visit ID直接和事实表关联而且粒度最细,所以按道理来说Visit ID属性的每一个值都应该能找到维度中对应的其它属性值,而现在由于内层表V_Fact_ADT_IPD_Encounter中有几行数据在外层表V_Dim_MedicalGroup中找不到对应的数据行,就导致有Visit ID的属性值找不到外层表V_Dim_MedicalGroup中Medical Group Code、Medical Group Description这两个属性,所以CUBE处理时就报KeyNotFound错误。那么现在我们如下图所示将外层表V_Dim_MedicalGroup中Medical Group Code、Medical Group Description两个属性的KeyColumns的NullProcessing设置为UnknownMember,那么内层表V_Fact_ADT_IPD_Encounter中在外层表V_Dim_MedicalGroup中找不到对应数据的数据行都会被归类到外层表V_Dim_MedicalGroup中Medical Group Code、Medical Group Description这两个属性的UnknownMember下,CUBE处理的时候也就不会报错了。那么如果维度中存在多张表时,是不是将外层表用到属性的KeyColumns的NullProcessing设置为UnknownMember就万事大吉呢了?答案是不是,请接着看下面一种情况。

    

  • 内层表V_Fact_ADT_IPD_Encounter的MedicalGroupCode字段有null值,导致两张表有数据行无法匹配。这时如果维度中有外层表V_Dim_MedicalGroup中的字段作为了维度属性,那么在默认情况下处理维度V Fact ADT IPD Encounter时,SSAS会直接将内层表V_Fact_ADT_IPD_Encounter中MedicalGroupCode字段为null的数据行忽略掉,会导致来自内层表V_Fact_ADT_IPD_Encounter的两个维度属性Visit ID、Patient Name的属性值个数变少,变少的个数就是内层表V_Fact_ADT_IPD_Encounter中MedicalGroupCode字段为null的数据行数。这时必须要将外层表V_Dim_MedicalGroup中与内层表V_Fact_ADT_IPD_Encounter发生关联的属性字段MedicalGroupCode作为维度属性,

    

并且在维度关系中设置MedicalGroupCode属性指向外层表V_Dim_MedicalGroup的其它维度属性(在本例中就是设置MedicalGroupCode属性指向MedicalGroupDescription属性)

这样至少在处理维度V Fact ADT IPD Encounter时,SSAS不会将内层表V_Fact_ADT_IPD_Encounter中MedicalGroupCode字段为null的数据行忽略掉了,但是在处理维度时会报错,原因是由于内层表Fact_ADT_IPD_Encounter中MedicalGroupCode字段为null的数据行无法匹配外层表V_Dim_MedicalGroup的数据行,导致外层表的两个维度属性Medical Group Code和Medical Group Description找不到KeyColumns的值,所以这时我们还需要将维度属性设置中的KeyNotFound选项设置为IgnoreError,这样在处理维度V Fact ADT IPD Encounter时就不会报KeyNotFound错误了。同时别忘了还是要像上面一点提到的一样,我们还要将外层表V_Dim_MedicalGrou用到的属性Medical Group Code、Medical Group Description的KeyColumns的NullProcessing设置为UnknownMember,那么在处理维度后内层表V_Fact_ADT_IPD_Encounter中MedicalGroupCode字段为null的数据行都会被归类到外层表V_Dim_MedicalGroup中Medical Group Code、Medical Group Description这两个属性的UnknownMember下,达到了我们预期的结果。

综上所述结合上面我们讨论的两点,在维度中用到多张数据表时,一定要保证外层表中和内层表发生关联的字段设置成了维度属性,同时在属性关系中要设置外层表中和内层表发生关联的维度属性指向外层表中用到的其它维度属性,而且要保证所有外层表的维度属性的KeyColumns的NullProcessing设置为了UnknownMember,这样内层表无法和外层表发生匹配的数据行才会被正确归类到UnknownMember中去,得到我们想要的结果。

SSAS维度上有多个表的注意事项的更多相关文章

  1. BI之SSAS完整实战教程6 -- 设计维度、细化维度上:创建维度定义特性关系

    前面我们使用过数据源向导.数据源视图向导.Cube向导来创建相应的对象. 本篇我们将学习使用维度向导来创建维度. 通过前面几个向导的学习,我们归纳一下共同点,主要分成两步 1. 使用某种对象类型的向导 ...

  2. 为什么上传文件的表单里要加个属性enctype

    为什么上传文件的表单里要加个属性enctype 上传文件的表单中<form>要加属性enctype="multipart/form-data",很多人只是死记硬背知道上 ...

  3. servlet文件上传2——复合表单提交(数据获取和文件上传)

    上传文件时表单enctype属性必须要更改为<enctype='multipart/form-data'>:采用post提交表单,元素需要有name属性: 利用第三方jar包(common ...

  4. 深度学习原理与框架-递归神经网络-RNN_exmaple(代码) 1.rnn.BasicLSTMCell(构造基本网络) 2.tf.nn.dynamic_rnn(执行rnn网络) 3.tf.expand_dim(增加输入数据的维度) 4.tf.tile(在某个维度上按照倍数进行平铺迭代) 5.tf.squeeze(去除维度上为1的维度)

    1. rnn.BasicLSTMCell(num_hidden) #  构造单层的lstm网络结构 参数说明:num_hidden表示隐藏层的个数 2.tf.nn.dynamic_rnn(cell, ...

  5. tf.reduce_sum tensorflow维度上的操作

    tensorflow中有很多在维度上的操作,本例以常用的tf.reduce_sum进行说明.官方给的api reduce_sum( input_tensor, axis=None, keep_dims ...

  6.  为什么上传文件的表单里要加个属性enctype----摘录

    上传文件的表单中<form>要加属性enctype="multipart/form-data",很多人只是死记硬背知道上传表单要这么写,知其然而不知其所以然.那到底为什 ...

  7. 在IOS设备上POST提交form表单,后台接收不到值怎么办?

    原文:https://blog.csdn.net/xhaimail/article/details/90440029 最近在工作上遇到一个奇葩问题,在Android和Windows平台上做请求时参数都 ...

  8. layui框架实现多图片手动上传和随表单提交方法

    首先在官方文档并没有手动上传的说明文档,这里手动实现上传原理是:在表单中有三个按钮,分别是上传图片按钮.隐藏上传按钮.表单提交按钮,点击上传图片按钮之后,图片添加在前端但是并没有真正的上传,而是在点击 ...

  9. 使用 JavaScript 用循环嵌套输出乘法表。外循环控制行数,内循环控制当前行要输出的乘法表达式,在页面上输出九九乘法表

    查看本章节 查看作业目录 需求说明: 在页面上输出九九乘法表,实现效果如图所示 实现思路: 创建HTML页面 在页面中嵌入 <script type="text/javascript& ...

随机推荐

  1. 获取网络状态ios(2G、3G、4G、Wifi)

    +(NSString *)getNetWorkStates{UIApplication *app = [UIApplication sharedApplication];NSArray *childr ...

  2. SQl中Left Join 、Right Join 、Inner Join与Ful Join

    1 left join 左外连接:查询结果以左表数据为准.假如左表有四条数据,右表有三条数据,则查询结果为四条,且都是左表中有的数据. 例如: EMP表: SAL表: 左连接 左连接,表EMP是主表, ...

  3. http://blog.csdn.net/clementad/article/details/47403185

    http://blog.csdn.net/clementad/article/details/47403185

  4. js运算之比较大小

    1.大于>和小于< var box = 3 > 2;//关系运算符大多返回的是一boolean值. alert(box); //true 1.2不同类型的数据比较 var box = ...

  5. asp.net 项目在 IE 11 下出现 “__doPostBack”未定义 的解决办法

    最近项目在 IE 11 下<asp:LinkButton> 点击出现 “__doPostBack”未定义”,经过一番google,终于知道了原因:ASP.NET 可能无法辨识出一些浏览器的 ...

  6. android framework浅析_转

    Android系统从底向上一共分了4层,每一层都把底层实现封装,并暴露调用接口给上一层. 1. Linux内核(Linux Kernel) 1)Android运行在linux kernel 2.6之上 ...

  7. status 状态栏

    http://www.pchou.info/ios/2015/08/22/oc-statusbar.html IOS的项目多数会遇到控制状态栏和导航栏的问题,比如隐藏状态栏.控制状态栏的文字颜色等,导 ...

  8. throw 语句

    我们也可以写代码来抛出异常,抛出异常的语句时throw,其格式如下: throw 异常类的对象名 用throw抛出异常,一般放在方法内部.一个程序可以有多个throw.throw语句执行时,其后面的代 ...

  9. UITextFiled

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  10. PostgreSQL/bin

    pg_receivexlog pg_receivexlog—以流的方式从一个PostgreSQL集簇得到事务日志 pg_receivexlog被用来从一个运行着的PostgreSQL集簇以流的方式得到 ...