SSAS维度上有多个表的注意事项
在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维度上有多个表的注意事项的更多相关文章
- BI之SSAS完整实战教程6 -- 设计维度、细化维度上:创建维度定义特性关系
前面我们使用过数据源向导.数据源视图向导.Cube向导来创建相应的对象. 本篇我们将学习使用维度向导来创建维度. 通过前面几个向导的学习,我们归纳一下共同点,主要分成两步 1. 使用某种对象类型的向导 ...
- 为什么上传文件的表单里要加个属性enctype
为什么上传文件的表单里要加个属性enctype 上传文件的表单中<form>要加属性enctype="multipart/form-data",很多人只是死记硬背知道上 ...
- servlet文件上传2——复合表单提交(数据获取和文件上传)
上传文件时表单enctype属性必须要更改为<enctype='multipart/form-data'>:采用post提交表单,元素需要有name属性: 利用第三方jar包(common ...
- 深度学习原理与框架-递归神经网络-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, ...
- tf.reduce_sum tensorflow维度上的操作
tensorflow中有很多在维度上的操作,本例以常用的tf.reduce_sum进行说明.官方给的api reduce_sum( input_tensor, axis=None, keep_dims ...
- 为什么上传文件的表单里要加个属性enctype----摘录
上传文件的表单中<form>要加属性enctype="multipart/form-data",很多人只是死记硬背知道上传表单要这么写,知其然而不知其所以然.那到底为什 ...
- 在IOS设备上POST提交form表单,后台接收不到值怎么办?
原文:https://blog.csdn.net/xhaimail/article/details/90440029 最近在工作上遇到一个奇葩问题,在Android和Windows平台上做请求时参数都 ...
- layui框架实现多图片手动上传和随表单提交方法
首先在官方文档并没有手动上传的说明文档,这里手动实现上传原理是:在表单中有三个按钮,分别是上传图片按钮.隐藏上传按钮.表单提交按钮,点击上传图片按钮之后,图片添加在前端但是并没有真正的上传,而是在点击 ...
- 使用 JavaScript 用循环嵌套输出乘法表。外循环控制行数,内循环控制当前行要输出的乘法表达式,在页面上输出九九乘法表
查看本章节 查看作业目录 需求说明: 在页面上输出九九乘法表,实现效果如图所示 实现思路: 创建HTML页面 在页面中嵌入 <script type="text/javascript& ...
随机推荐
- 根据 字数 确定 UI控件高度
//字体 textLabel.font = [UIFont systemFontOfSize:13]; CGFloat labelWidth = [UIScreen mainScreen].bound ...
- Java学习-035-JavaWeb_004 -- JSP include 指令
inclue 指令是将不同的文件插入到 JSP 网页中,这些文件可以是文本文件.HTML文件.JSP 文件,指令语法如下: <%@include file="相对路径"%&g ...
- js获取网站根目录
//js获取网站根路径(站点及虚拟目录),获得网站的根目录或虚拟目录的根地址 function getRootPath(){ var strFullPath=window ...
- Keep Alive
跳板机时经常出现连接被断开的情况.如果发生这种情况,请在客户端配置Keep Alive设置,具体方法参考如下: Windows: secureCRT:Properties -> Terminal ...
- 在CentOS6.5上安装Tomcat6
Tomcat安装一向方便,linux的比win的更是这样,基本就是拷贝,类似于win中备受青睐的绿色软件,下面只是记录一下过程. 1.从 http://mirrors.cnnic.cn/apache/ ...
- iOS:app直播---采集篇
[如何快速的开发一个完整的iOS直播app](采集篇) 转载自简书@袁峥Seemygo:http://www.jianshu.com/p/c71bfda055fa 前言 开发一款直播app,首先需要采 ...
- python 上传下载文件
server.py #!/usr/bin/env python # -*- coding:utf- -*- import SocketServer import os class MySocketSe ...
- nodejs 入门
1. hello word hello.js console.log("hello"); node hello.js即可 2.调试 如果 npm install太慢 可以使用国内淘 ...
- java 笔记(4) —— java I/O 流、字节流、字符流
Java中使用流来处理程序的输入和输出操作,流是一个抽象的概念,封装了程序数据于输入输出设备交换的底层细节.JavaIO中又将流分为字节流和字符流,字节流主要用于处理诸如图像,音频视频等二进制格式数据 ...
- PostgreSQL Replication之第九章 与pgpool一起工作(7)
9.7 处理故障转移和高可用 可以使用pgpool来解决的一些明显的问题是高可用性和故障转移.一般来讲,有使用pgpool或者不使用pgpool可以用来处理这些问题的各种方法. 9.7.1 使用Pos ...