SSAS-many 2 many one simple sample
基本业务:一个事件发生后,影响到多个国家,这个事件也会被定一个事件类型(这里简化为type1,2,3),处理这个事件花费多长时间。
我们的事实表就记录这个事情,相对应的我们设计两个维表,一个是国家,一个是事件类型,我们可以从这两个维度slice数据。
因为受影响的国家是多值的,所以一条fact表中的记录,会对应多条维度表中的记录,在这里,我使用了一个桥接表来处理这种多对多
的关系,这是第一种实现方案,是正确的方案。
第二种是我引入了另外一张规范化的表,来直接建立一个星型模型,实现后有一些问题,引以为戒。
因为这种方式实现后,事实表的多行可能都表示同一个事件,只是影响的国家不同而已,这样通过国家维度聚合是没有问题,但是通过
其他维度如事件类型,进行聚合, 就会发生重叠计算。计算事件的count都需要distinct.而在SSAS中还需要单独列出一个measuregroup,
性能上也不佳。
Create database mybi;
create table FactIncident(pk int,incidentid int,impactedcountries varchar(2000),incidenttype int,usedHours int);
insert into FactIncident values(1,1,'china,japan,India',1,100);
insert into FactIncident values(2,2,'china,japan,India,USA',2,200);
insert into FactIncident values(3,3,'china,japan',3,300);
select * from FactIncident;
create table country(cid int,country varchar(50));
insert into country values(1,'china');
insert into country values(2,'japan');
insert into country values(3,'India');
insert into country values(4,'USA');
create table incidenttype(id int, typename varchar(20));
insert into incidenttype values(1,'type1');
insert into incidenttype values(2,'type2');
insert into incidenttype values(3,'type3');
create table bridgeTable(countrieslist varchar(2000),country varchar(50));
select * from FactIncident;
--insert into bridgeTable
--SELECT clist, split.Part.value('text()[1]', 'VARCHAR(30)') as country
--FROM (SELECT impactedcountries,CAST('<p>' + REPLACE(impactedcountries,',','</p><p>')+'</p>' AS XML)
-- FROM FactIncident) innerQ(clist,xmlField)
--CROSS APPLY innerQ.xmlField.nodes('p') split(Part)
如果我们直接构建星型模,需要把多值合并的列数据给规范化起来,需要创建另外一张Fact表,需要如下代码:
create table FactIncidentSplit(pk int,incidentid int,impactedcountryid int,incidenttypeid int,usedHours int);
insert into FactIncidentSplit
select
ROW_NUMBER() over (order by incidentid) as pk,
f.incidentid,
cc.cid as impactedcountryid,
f.incidenttype,
f.usedHours
from factincident f join
(
select pk,
splits.country.value('text()[1]', 'VARCHAR(30)') as country
from
(select pk, CAST( '<p>' + REPLACE(impactedcountries,',','</p><p>') +'</p>' as XML)
from FactIncident) xx(pk,clist)
cross apply xx.clist.nodes('p') splits(country)
) ff
on f.pk=ff.pk
join
country cc
on cc.country=ff.country
然后把这张表加到DSV中来,建立好关系,建立一个measuregroup,设定好dimensionusage.

由下图可见,在使用事件类型维度的时候,规范化的事实表的事件总数和花费时长都是有问题的。
当然,如果把国家维度拖进来的话,就会正确。但这种影响是不应该的。
而使用桥接表的事实表是得到了正确的计算。

附件是SSAS项目的压缩文件,欢迎下载:
http://files.cnblogs.com/huaxiaoyao/AnalysisServicesProject1.rar
SSAS-many 2 many one simple sample的更多相关文章
- [转]simple sample to create and use widget for nopcommerce
本文转自:http://badpaybad.info/simple-sample-to-create-and-use-widget-for-nopcommerce Here is very simpl ...
- ASP.NET MVC 4 WebAPI Simple Sample
// Controllers.cs namespace Microshaoft.WebApi.Controllers { using Microshaoft.WebApi.Models; using ...
- hdu4975 A simple Gaussian elimination problem.(正确解法 最大流+删边判环)(Updated 2014-10-16)
这题标程是错的,网上很多题解也是错的. http://acm.hdu.edu.cn/showproblem.php?pid=4975 2014 Multi-University Training Co ...
- hdu 4975 A simple Gaussian elimination problem.(网络流,推断矩阵是否存在)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4975 Problem Description Dragon is studying math. One ...
- A simple Gaussian elimination problem.(hdu4975)网络流+最大流
A simple Gaussian elimination problem. Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65 ...
- HDOJ 4975 A simple Gaussian elimination problem.
和HDOJ4888是一样的问题,最大流推断多解 1.把ISAP卡的根本出不来结果,仅仅能把全为0或者全为满流的给特判掉...... 2.在残量网络中找大于2的圈要用一种类似tarjian的方法从汇点開 ...
- HDU 4975 A simple Gaussian elimination problem.
A simple Gaussian elimination problem. Time Limit: 1000ms Memory Limit: 65536KB This problem will be ...
- [翻译+山寨]Hangfire Highlighter Tutorial
前言 Hangfire是一个开源且商业免费使用的工具函数库.可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的后台任务,而无需自行定制开发和管理基于Windows ...
- Atitit webservice的发现机制 discover机制
Atitit webservice的发现机制 discover机制 1.1. Ws disconvert 的组播地址和端口就是37021 1.2. Ws disconvert的发现机制建立在udp组播 ...
随机推荐
- 如何在ASP.Net中实现RSA加密
在我们实际运用中,加密是保证数据安全的重要手段.以前使用ASP时,对数据加密可以使用MD5和SHA1算法,这两种算法虽然快捷有效,但是无法对通过它们加密的密文进行反运算,即是解密.因此需要解密数据的场 ...
- 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法
[源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...
- 与众不同 windows phone (51) - 8.1 新增控件: DatePickerFlyout, TimePickerFlyout
[源码下载] 与众不同 windows phone (51) - 8.1 新增控件: DatePickerFlyout, TimePickerFlyout 作者:webabcd 介绍与众不同 wind ...
- Studio for Winforms FlexGrid: 创建分类汇总
C1FlexGrid.Subtotal方法可以增加包含普通(非小计)行的汇总数据的分类汇总行. 分类汇总支持分层聚合.例如,如果你的表格包含销售数据,你可能会通过产品.地区和推销员来小计一下以得出总的 ...
- Fresco
1.简介 Fresco是Facebook最新推出的一款用于Android应用中展示图片的强大图片库,可以从网络.本地存储和本地资源中加载图片.相对于ImageLoader,拥有更快的图片下载速度以及可 ...
- CSS之浮动那些事
1.清除浮动 下面是两种常用的方式,而这两招也够用了(不用千招会,只需一招精). 1.结尾处加空div标签 clear:both <style type="text/css" ...
- SQLSERVER数据库表各种同步技术
1 --SQLSERVER数据库表各种同步技术 减少SQLServer中每次的同步数据量 2 3 --说到数据库,我就不由地想到同步数据,如何尽可能地减少每次的同步数据量,以此来提高同步效率,降低对网 ...
- 今天发现新大陆:haml和Emmet
其实一开始小渣渣我只是想接触一下(css预处理器)sass,可是突然冒出一个haml. 原文是酱紫的. Sass 是采用 Ruby 语言编写的一款 CSS 预处理语言,它诞生于2007年,是最大的成熟 ...
- 为什么每个浏览器都有Mozilla字样?
你是否好奇标识浏览器身份的)”,于是IE可以收到含有框架的页面了,所有微软的人都嗨皮了,但是网站管理员开始晕了. 因为微软将IE和Windows捆绑销售,并且把IE做得比Netscape更好,于是第一 ...
- ADODB.Connection 错误 ‘800a0e7a’ 未找到提供程序
问题表现:做网站ASP页面提示:ADODB.Connection 错误 '800a0e7a' 未找到提供程序.该程序可能未正确安装. 解决方案:一般都是64位系统的原因,把IIS切换为32Bit模式运 ...