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& ...
随机推荐
- Mac废纸篓 不能完全清空的有效解决方法
摘自:http://www.neonan.com/articles/5582 对于苹果用户来说, 可能都会遇到过这样的情况(尽管这种情况是不常出现的!), Mac OS X系统突然出现一些顽固的文件家 ...
- Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never diffe
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public class ...
- Download InstallShield Limited Edition for Visual Studio 地址
http://learn.flexerasoftware.com/content/IS-EVAL-InstallShield-Limited-Edition-Visual-Studio?lang=10 ...
- QMainWindow的setLayout的问题
因为QMainWindow有自己的layout,所以需要一个QWidget,然后setCentralWidget,给这个QWidget调用setLayout http://stackoverflow. ...
- 如何禁止DELETE、PUT、OPTIONS、TRACE、HEAD等协议访问应用程序 .
原文:http://linder.iteye.com/blog/735435 简介 WebDAV (Web-based Distributed Authoring and Versioning)是 ...
- php 配置本地自定义域名
一.设置host文件 二.设置httpd.conf # Virtual hosts Include conf/extra/httpd-vhosts.conf 三.设置httpd-vhosts.conf ...
- MSDN相关下载地址
Windows Server 2016官网下载:https://msdn.microsoft.com/zh-cn/subscriptions/downloads/default.aspx#search ...
- CNContact对通讯录的基本使用(第二篇)
/** * 注意:iOS9才有能使用 * 首先在工程里导入ContactsUI.framework和Contacts.framework两个框架 * * * 源代码的链接地址 * 链接: http:/ ...
- Java基础之写文件——将多个字符串写入到文件中(WriteProverbs)
控制台程序,将一系列有用的格言写入到文件中. 本例使用通道把不同长度的字符串写入到文件中,为了方便从文件中恢复字符串,将每个字符串的长度写入到文件中紧靠字符串本身前面的位置,这可以告知在读取字符串之前 ...
- Leetcode: Implement Trie (Prefix Tree) && Summary: Trie
Implement a trie with insert, search, and startsWith methods. Note: You may assume that all inputs a ...