在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. 关于actionscript中新建一个sprite,设置大小(宽高)的问题。

    有一定as3开发经验的童鞋应该知道,新建一个sprite,是无法设置大小的,即时设置了,也不会生效,宽高还是为0,据说反而有副作用(http://www.cnblogs.com/yjmyzz/arch ...

  2. chem02-- ajax登录

    1.ajaxLogin.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&quo ...

  3. logstash

    logstash作为数据搜集器,主要分为三个部分:input->filter->output  作为pipeline的形式进行处理,支持复杂的操作,如发邮件等 input配置数据的输入和简 ...

  4. synzhronized原理3

    1.java中的每个对象都可作为锁,有三种表现形式: 对于普通方法,锁的是当前this对象. 对于静态方法,锁的是class对象 对于方法块,锁的是synchronized指定的对象. 2.JVM基于 ...

  5. JQuery:JQuery遍历详解

    JQuery:遍历一.什么是遍历?jQuery 遍历,意为"移动",用于根据其相对于其他元素的关系来"查找"(或选取)HTML 元素.以某项选择开始,并沿着这个 ...

  6. Android 多线程处理之多线程用法

    handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法,却没有执行start()方法,所以runnable走的还是UI线程. 1.如果像这样,是可以操作ui ...

  7. Unicode和多字节字符集 (MBCS) 杂谈

    这个估计是很多人曾经头疼过的问题,现在的VC版本基本都支持Unicode和多字节字符集 (MBCS),在进行MFC编程时VC的默认设置是unicode字符集.但是我们通常需要做一些代码移植的工作,如果 ...

  8. Android百度地图开发(一)之初体验

    转载请注明出处:http://blog.csdn.net/crazy1235/article/details/42614603 做关于位置或者定位的app的时候免不了使用地图功能,本人最近由于项目的需 ...

  9. JQuery 操作HTML元素 示例

    http://www.w3school.com.cn/jquery/jquery_dom_add.asp http://www.w3school.com.cn/jquery/jquery_dom_re ...

  10. Android --ListView模板

    调整了近一上午的模板 ListView表头 <?xml version="1.0" encoding="utf-8"?> <LinearLay ...