SSAS Date 维度基本上在所有的 Cube 设计过程中都存在,很难见到没有时间维度的 OLAP 数据库.但是根据不同的项目需求, Date 维度的设计可能不大相同,所以在设计时间维度的时候需要搞清楚几个问题: 你的业务涉及到的最低的细节级别是什么?比如按季度查看报表还是按月份,或者按周,或者再甚者按天.这个细节级别需要弄清楚,比如在一些销售数据统计,有的时候可能更多按季度或者按月来查看报表.但在有的监控一些机器运行数据的统计,可能会按照小时或者分钟来查看报表. 你的报表所需要时间显示的格式…
在 CUBE 设计过程中有一个非常重要的点就是定义维度与度量值组关系,维度的创建一般在前,而度量值组一般来源于一个事实表.当维度和度量值组在 CUBE 中定义完成之后,下一个最重要的动作就是定义两者之间的关系.在前面几篇文章中也已经看到了如何将度量值组和维度通过哪些维度属性进行关联的操作,但是那些关联通常都是 Regular 类型的,属于直接的普通的关联. 但是实际上除了 Regular 之外,还有 Fact, Referenced, Many to Many 和 Data Mining(数据挖…
开篇介绍 对于维度成员和事实数据直接的关系看到更多的可能还是一对一,一对多的关系.比方在事实维度(或退化维度)中一个订单和明细号组合而成的ID,对应的就是事实表中的一条数据,这就是一对一的关系.比方说在产品维度中,一个产品维度成员可能对应着多个事实数据成员,这就是一对多的关系.说简单点,就是事实表的外键引用了维度表的主键,形成了这种关系. 下面的这个例子就是一种多对多的情况,通常情况下,如果维度和度量值组中间是多对多的关系,那么在它们之间就需要创建一个中间事实表. 这个中间事实表的主键在数据仓库…
这篇文章是基于上一篇 SSAS 系列 - 多维数据集维度用法之一 引用维度 Referenced Dimension 继续讲解多维数据集维度用法中的事实维度. 事实维度,顾名思义就是把事实表 Fact*** 中的某一个或多个属性抽取出来形成一个维度,而不像以前直接通过维度表 Dim*** 来创建一个维度. 先来了解一下为什么不通过维度表来创建维度,而非要从一个事实表中抽取某个属性形成一个单独的维度,这是我们的疑问. 下面是从 FactResellerSales 表中抽取的一些记录,主要包括订单编…
在熟悉完下面这三种维度的创建方式之后,就可以开始创建我们的第一个 Cube 了. SSAS 系列 - 自定义的日期维度设计 SSAS 系列 - 基于雪花模型的维度设计 SSAS系列 - 关于父子维度的设计 我们将使用下面的这些脚本来创建一些维度表和事实表,数据源的来源是 AdventureWorksDW2012,但由于数据列太多因此我精简了一些表并且自定义了 DimDate 表. USE BIWORK_SSIS GO SET NOCOUNT ON IF OBJECT_ID('FactIntern…
基于雪花模型的维度以下面的 Product 产品与产品子类别,产品类别为例. DimProduct 表和 DimProductSubcategory 表有外键关系,而 DimProductSubcategory 表和 DimProductCategory 表存在外键关系. 测试的维度表与数据 - USE BIWORK_SSIS GO IF OBJECT_ID('DimProduct') IS NOT NULL DROP TABLE DimProduct GO IF OBJECT_ID('DimP…
SQL Server 2012 中提供了开发 SSAS 项目的两种模型,一种是新增加的 Tabular Model 表格模型,另一种就是原始的 Multidimensional Model 多维模型. 在这里演示的是 Multidimensional Model,如果要了解 Tabular Model 表格模型,请参看 - http://www.cnblogs.com/biwork/archive/2013/05/22/3093896.html 下面使用的环境是 VS2012 + SSDT 集成…
在 SSAS 系列 - 实现第一个 Cube 以及角色扮演维度,度量值格式化和计算成员的创建 中主要是通过已存在的维度和事实数据创建了一个多维数据集,并同时解释了 Role-Playing Dimension 角色扮演维度,计算成员,计算成员格式化等内容.在这篇文章中主要是分析和理解在多维数据集设计过程中的聚合函数,对应不同类别的度量值根据需求的不同在聚合函数的选择上也会有所不同. 继续使用在上一篇 SSAS 文章中创建的示例,在 BIWORK_FirstCube 中能看到有两组度量值维度组和各…
维度的优化 在 SSAS 开发设计过程中,维度的优化非常重要,因为它在 SSAS 分析服务性能调优的过程中往往能起到一个非常重要的作用. 一般来说,对于 Cube 的性能优化第一步可能考虑的就是查看维度,观察维度中属性关系的设计. 这里有两种最重要的调优方法可以参考: 确认属性关系 有效的使用用户自定义的层次结构 定义属性关系 属性关系定义了属性之间的依赖关系,比如如果 A 有一个关联的属性 B, 那么就是 A -> B.比如,一个给定的属性关系 City -> State, 如果当前的城市是…
除了之前的几篇文章中出现的时间维度,雪花型维度的设计之外还有一种比较特殊的维度 - 父子维度.父子维度特殊就特殊在它包含了一种基于递归关系(Recursive Relationship)的引用结构,  在我的这篇文章中提到了如何基于父子层次结构来设计和制作 SSRS 报表,不过那个报表是基于数据仓库的.而现在我们要设计的是基于父子结构的维度,在此基础之上我们也可以设计出基于 SSAS 数据库的 SSRS 报表. 下面仍然是我们的测试表和数据,测试表包含了一个员工维度表和销售的事实表. USE B…
在SSDT中部署一个 SSAS 项目到本地服务器上出现错误. You cannot deploy the model because the localhost deployment server is not running in multidimensional mode. 错误原因是因为我在本地安装 SQL Server 2012 的时候只选择安装了 Tabular Mode,而这个Demo项目是多维数据集项目,在 SQL Server 2012 中被称之为 Multidimensiona…
之前我写了一篇在 SSRS 开发中处理这种父子关系的汇总与聚合的文章 (SSRS 系列 - 使用分组 Group 属性实现基于父子递归关系的汇总报表),示例中的查询是基于 SQL Server 关系型数据库的,这一篇是基于 MDX 父子维度的 SSRS 报表. 沿用上一篇中的 (SSAS系列 - 关于父子维度的设计)父子维度 和(SSAS 系列 - 自定义的日期维度设计) 的时间维度,并在此基础上创建 Cube 并部署. 当然在这个例子中可能不会使用到时间维度,之所以添加进来只是因为在 Cube…
开篇介绍 这一篇文章是 微软BI 之SSIS 系列 - 带有 Header 和 Trailer 的不规则的平面文件输出处理技巧 的续篇,在上篇文章中介绍到了对于这种不规则文件输出的处理方式.比如下图中的这种不规则文件,第一行,第二行 Header 部分,第三行的内容 Content 部分,最后一行的 Trailer 部分. 在前几个课程 微软BI SSIS 2012 ETL 控件与案例精讲 第43,44,45,46 课中,我分别讲解了如何使用 .Script Component Source 解…
原文:微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件 开篇介绍 大多数情况下我们的 SSIS 包都会配置在 SQL Agent Job 中周期性的按计划执行,比如每天晚上调用 SSIS 包刷新数据,处理 Cube 等.一旦 SSIS 包中出现任何异常,报错,那么配置在 SQL Agent Job 中的通知,邮件提醒就会把这些错误信息发邮件到指定的用户或者系统维护者,这样就起到了一个错误监控的作用. 但是在有的情况下,有一些…
案例背景与需求介绍 之前做过一个美国的医疗保险的项目,保险提供商有大量的文件需要发送给比如像银行,医疗协会,第三方服务商等.比如像与银行交互的 ACH 文件,传送给协会的 ACH Credit 等文件.这些文件格式在美国都是开放的,通用的,可以直接到相关网站下载.也就是说像银行,协会等他们接受这种固定格式的文件,读取数据,读取公司编号进行业务来往或者记录.我当时就是直接在网上搜索到一个 PDF 格式的文件说明,大概有10来页,就是告诉你这个格式是如何定义,应该如何来处理的. 那么这种文件并非像我…
开篇介绍 关于 Lookup 的缓存其实在之前的一篇文章中已经提到了 微软BI 之SSIS 系列 - Lookup 组件的使用与它的几种缓存模式 - Full Cache, Partial Cache, NO Cache 但是还是可能遗漏的部分内容,因此在这里重新总结并补充一下.这是第一篇,还是从理论的角度来讨论 Lookup 缓存的问题:后面有空还会再写一篇,从后台 SQL 执行的情况来理解 Lookup 的工作过程.   并且关于 Lookup 缓存还有其它比较有意思的话题,比如我的这些帖子…
开篇介绍 来自 天善学院 一个学员的问题,如何在 SSIS 中导入 ACCESS 数据表中的数据. 在 SSIS 中导入 ACCESS 数据库数据 ACCESS 实际上是一个轻量级的桌面数据库,直接使用文件形式存储.在国内大量使用 ACCESS 作为 BI 数据源并不多,但是在国外特别是美国使用的还比较多,因为他们的 IT 基础起步比较早.在我的第一个美国的医疗保险项目中,就遇到过大量的 ACCESS 数据源,前后总共有 500 多个 ACCESS 表.而现在从国外一些朋友反馈的情况仍然还有在使…
开篇介绍 前些天自己在整理 SSIS 2012 资料的时候发现了一个功能设计上的疑似Bug,在 Script Task 中是可以给只读列表中的变量赋值.我记得以前在 2008 的版本中为了弄明白这个配置,还特意测试过这个细节,获取错误并理解了这个功能.但是现在回去再次测试 2008 的版本时,发现这个功能在 2008 中其实也是错误的,把我印象中的测试结果完全给推翻了,所以到现在已经搞不清楚我当时到底是如果得出这个错误的. 疑似功能 Bug 描述 在 SSIS 包中定义了用户自定义变量 - PV…
开篇介绍 关于 Slowly Changing Dimension 缓慢渐变维度的理论概念请参看 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型及原型设计 本篇文章总结了实现缓慢渐变维度的几种方式,并且分析了 Changing Attribute 和 Historical Attribute 输出的逻辑过程. 示例一:SSIS 中使用 Slowly Changing Dimension 控件 示例二:使用 SQL 中 Merge 语句实现简…
开篇介绍 前几天碰到这样的一个问题,在 Lookup 中如何设置大小写不敏感比较,即如何在 Lookup 中的字符串比较时不区分大小写? 实际上就这个问题已经有很多人提给微软了,但是得到的结果就是 Closed and Won’t fix. 说白了,这个就是 By Design,包括到现在的 2012 也没有这个配置选项. https://connect.microsoft.com/SQLServer/feedback/details/339069/ssis-case-sensitive-dat…
开篇介绍 Execute SQL Task 这个控件在微软BI ETL 项目中使用的频率还是非常高的,也是大部分入门 SSIS 初学者最早接触到的几个控制流控件. 我们通常使用 Execute SQL Task 的场景包含但不止于以下几类: 在从源端加载数据到 Staging 表之前使用 Execute SQL Task 执行一些 Truncate 操作. 执行一些 Log 的插入,更新操作. ETL 过程中的 Merge 语句操作. XML 的输出处理. 关于如何使用 Execute SQL…
开篇介绍 在 SSIS 中操作文件的输入和输出是非常方便的,这个例子讲解一个最简单的需求:比如每天从数据库中查询一批数据要输出到文件,每天产生一个文件,那么文件的名称按照"文件名+日期"的格式加以区别,比如 Employee20131225.txt . 测试案例 我的测试数据非常简单,就是一个查询语句,要将这些查出来的数据输出到文件并使用逗号分隔,每个文件根据时间加以区别. SELECT EmployeeKey, ParentEmployeeKey, EmployeeNationalI…
来自群里面讨论的一个问题,EXCEL 中有类似于这样的图形,上面是 Chart, Chart X轴上的值正好就是下方 Table 的列头,这个在 SSRS 中应该如何实现?   SSRS 2008.2008RS,2012 中实际上没有这种对应的控件,我们通常想到的方式可能是上方一个单独的 Chart 图,下方一个 Table 然后合并在一起.但是这样会存在一些问题,因为 Chart 轴的值不是固定的,会随着聚合值的增加而扩展.并且对于表中的列头来说也没有办法完全能够和 Chart X 轴上的坐标…
开篇介绍 SQL Profilling Task 可能我们很多人都没有在 SSIS 中真正使用过,所以对于这个控件的用法可能也不太了解.那我们换一个讲法,假设我们有这样的一个需求 - 需要对数据库表中的一些数据做一些数据分析,比如统计一下数据表中各列中实际数据的长度,各长度区间范围:比如统计一下各数据列中非空字段的比例,表的行数,重复字段等等.那么如果不是专门做过这种数据源数据分析的话,可能不知道用什么方式能够非常快的得到这些信息.写 SQL 语句?我想这个过程也是非常耗费时间和精力的. 实际上…
开篇介绍 这是今天在帮别人看一个 2008R2 版本的项目时发现的一个 Bug,这个 Bug 在 SQL SERVER 2012 有的版本中可能已经解决,但在论坛上看到有的仍然存在. 在 SQL SERVER 2008 R2 版本中,比如从一个数据库表中取一个 BIGINT 类型的数据,赋值给一个 Int64 类型的变量,按照我们的理解肯定是正确的. 但是结果是报错了 - 错误原因:类型不一致造成的. [Execute SQL Task] Error: An error occurred whi…
开篇介绍 Web Service 的用途非常广几乎无处不在,像各大门户网站上的天气预报使用到的第三方 Web Service API,像手机客户端和服务器端的交互等都可以通过事先设计好的 Web Service 接口来实现两个不同平台的信息沟通. 记得第一次做 IPhone 手机客户端与服务器端交互的 Web Service 接口的时候,由于我们在客户端开发和服务器端开发都没有 IOS 平台开发经验,白天有其它的项目,只能利用晚上的时间不断尝试.最终在第三个通宵的时候,尝试搭建的第3套不同版本的…
开篇介绍 在 SSIS Data Flow 中有一个 Multicast 组件,它的作用和 Merge, Merge Join 或者 Union All 等合并数据流组件对比起来作用正好相反.非常直观,它可以将一个数据流平行分开成为多个数据流供下游其它 Data Flow 组件使用. 使用 Multicast Task 的几种情形 第一种,从同一个数据源中取出一部分数据直接放到 A 表中,一部分数据直接放到 B 表中.我曾经遇到一个370多列的一个文件,这370列的文件可以分出列数不等的7,8…
开篇介绍 这个问题来自于 天善BI社区,看了一下比较有意思,因为我自己认为在 SSIS中处理各种类型文件的经验还比较丰富(有一年的时间几乎所有ETL都跟文件相关),但是这个问题确实之前没有特别考虑过.研究了一下,找到了解决的方法,赶紧记录下来. 简单描述一下这个问题,如果我们的 SOURCE 是直接从表里面查询,然后输出到文件的时候,查询语句中列的顺序就是输出文件列的顺序(逗号分隔的文件).但是如果使用变量查询语句,那么这个输出顺序和查询列的顺序就会不一致了!如果我们的文件格式已经提前定义好了,…
文章更新历史 2014年9月7日 - 加入了部分更新内容,在文章最后提到了关于不同 Office Excel 版本间的连接问题. 开篇介绍 这篇文章主要总结在 SSIS 中访问和处理 Excel 数据的四个方面的主题内容 (都是处理以 .xlsx 结尾的 Excel 文件) - 如何在 SSIS 中集成对 Microsoft Excel 的访问支持以及注意事项. 如何在 SSIS 中连接和访问 Microsoft Excel 文件以及注意事项. 如何加载不同 Sheet 页的数据到同一个表中.…
这篇文章源于在上一篇博文中有园友提出订阅 SSRS 报表时的一个问题,  于是就好好总结了一下,把有关 SSRS 报表订阅的要点和容易出现问题的地方写出来,希望对大家有所帮助! 参看上一篇博文 - SSRS 报表中分组聚合的展开和收起效果与处理不规则层次结构的技巧(没有子元素的时候不展开, 删除+符号) 先展示订阅成功的效果之一 进入正文.... 首先,先列出常见问题,大家多多少少碰到过. 第一,在SSRS报表订阅的地方找不到 Email 的选项 - Choose a method of del…