章节1 什么是DAX
DAX是一种应用于SSAS,Power Pivot的编程语言,创建与2010年,第一个版本发布于excel2010的PowerPivot中。随着时间的的发展,DAX在excel中逐步发展,开始是在Excel中建模,然后是在BI领域使用DAX在SSAS中建立模型。
DAX是一种简单的语言,它和其他的编程语言不同,熟悉适应它需要一些时间。按照作者教过的数千学生得出的经验,学习DAX通常遵循以下的流程:你可以在学习几个小时后,就开始上手使用它,但是当开始需要了解一些高级的概念,例如上下文,迭代,和上下文转换时候,事情开始变得复杂起来,这时候别放弃!你需要一些耐心,一旦你的大脑开始消化这些概念,DAX语言,确实是一门简单的语言。你需要时间来了解学习它。
第一个章节会以一个简单的概括,来介绍什么是数据模型,表以及关系。在这里,建议所有的读者,无论您处于什么水平阶段,都阅读此部分,以熟悉一些这贯穿本书使用的概念,例如表,模型,不同的关系。
接下来的部分,对于有某些其他编程语言的读者——例如excel,SQL,MDX,我们提供一些建议。不同的章节针对不同的语言用户,我们对比了其和DAX的语言的区别,有助于您快速熟悉DAX。如果 您是Excel用户,但是觉的MDX语言非常难懂,这是完全正常的。这种情况,就直接跳过这个部分就可以了,因为这部分内容对于您而言几乎是毫无意义。所以直接到下一个章节,从那里,开始DAX的学习。
数据模型介绍
DAX语言是针对数据模型中的业务计算,特别设计的语言。你可能已经知道什么是数据模型,但是如果您对它还不是非常熟悉,非常建议您花一些时间,来了解什么是数据模型、关系,给后面的DAX语言建立一个良好的基础。
数据模型是一系列的表,它们之间通过关系连接起来。
我们知道,表是这样构成的:一系列包含数据的行,每行又分为许多列,每个列有各自的数据类型,并且包含各自代表的含义。通常我们称一行为一个记录。对于组织数据,表是一种十分方便的工具。一个数据表,其本身就是一个数据模型,也就是模型的最简单的一种形式。因此,当你在Excel工作簿中些名称和数字的时候,实际上你就是在建数据模型。
如果数据模型包含许多表,那么它们之间很可能存在关系。一个关系,连接了两张表。当两张表通过关系关联起来的时候,我们称他们关联了。看下图,关系被表示为连接两个表之间的线。
我们将学习关系的一些重要知识:
1.处于关系中的两个表,它们的角色是不相同的。一个是“一方”,一个是“多方”,看图中表Product和Product Subcategory。一个子类目包含了多个产品,而一个产品只有一个子类目。因此,Product Subcategory是关系中的“一方”,而Product则是“多方”。
2.用来创建关系的列,称为关系的键,在关系“一方”的列,需要是每行都是唯一值,不能有重复。“多方”的列,允许相同的值出现在多行。当一列都是唯一值的时候,我们称其为这个表的键。通常,表都有一个表示为键的列。
3.关系可以形成链条,每个product有一个subcategory,每个subcategory有一个categroy。那么,每个product就有一个category。要获得product对应的category,需要跨过两个关系组成的链条。图中展示了一个例子,由三个关系组成的链条,从Sales表开始,一直延伸到Product Category。
4.每个关系中,可能有一个或者两个箭头,图中可以看到Sales表和Product表中的关系,有两个箭头,而其他的关系只有一个箭头。箭头的方向,表示自动筛选的方向。这个功能,我们在后面的章节会深入的探讨,正确掌握筛选的方向,是一个重要的学习点。
5.在表格模型里,数据引擎支持的关系只能建立在一个列上,多列形成的关系是不支持的。
关系的方向介绍
上篇我们有提到,关系可以有一个或者两个筛选方向。筛选总是从关系的“一方”往“多方”筛选,如果关系是双向的,也就是有两个箭头,那么,筛选方向方向也可以是从“多方”往“一方”。
通过案例,您可以更好的理解这个筛选的问题。如果你按之前的数据模型,建立一个透视表,行是years, Sum of SalesAmount 和 Count of ProductName在值的位置,这样你会得到下面这个结果。
行标签是years,它来自于Date表。Date表在与Sales表的关系中,处于“一方”。所以,当你把 Sum of SalesAmount添加到透视表中,计算引擎会对sales表过滤年份。sales表和product表的关系是双向的。当你把count of product names 放到透视表,你就得到结果,即每年的 number of products。换一种说法就是,对于年份的过滤,通过关系链条,传导到了product表。
如果你调整下透视表,把color放导行,添加Count of FullDateLabel到值的位置,这个结果就有些难以理解。如下图
过滤条件是color列,它是product表其中一列,因为product表在与sales表关系中,处于“一方”,所以
Sum of SalesAmount可以正常筛选。Count of ProductNames也明显是正确的,因为它就是来自与product表。错误的是 Count of FullDateLabel。事实上,它在所有行返回的都是相同的值——即Date表的总行数。
过滤条件没有到达Date表的原因是,date表和sales表的关系是单项的,从date表指向sales表。因此,即使sales表有活动的过滤条件,但是这个条件无法传导下去到达date表,因为他们被表之间的关系阻止了。如果你改变date表和sales表的关系,更新为双向的。那么结果会是如下的:
如你所见,结果不同了,正确显示了至少有个特定颜色产品销售的天数。第一眼看去,你会觉的所有的关系似乎都应该定义为双向的,这样就可以让筛选条件自由传导而得到正确的结果。但是随着本书的学习,在设计数据模型的时候,这个方法不总是完全正确的。事实上,这要取决于你要解决的工作场景,以此来选择表间关系的设置。