写点什么

Excel 用户如何学习数据分析语言 DAX?

发布于: 2021 年 05 月 01 日
Excel用户如何学习数据分析语言DAX?


以下内容节选自《DAX 权威指南:运用 Power BI、SQL Server Analysis Services 和 Excel 实现商业智能分析》一书!



--正文--

DAX(Data Analysis eXpressions),即数据分析表达式,是 Microsoft Power BI、Microsoft SQL Server Analysis Services(SSAS)和 Microsoft Power Pivot for Excel 中使用的编程语言。

它创建于 2010 年,是随 PowerPivot 的第一个版本 PowerPivot for Excel 2010 一起发布的(在 2010 年,PowerPivot 的拼写还没有空格;空格是在 2013 年引入的)。

随着时间的推移,DAX 在那些讨论 Power Pivot 数据模型的 Excel 社区和讨论 Power BI 与 SSAS 数据模型的商业智能(BI)社区中逐渐流行起来。

DAX 是一门跨多产品的分析语言,这些产品使用同一个名为 Tabular 的内部引擎。

出于这个原因,我们经常用表格模型(Tabular Model)作为这些产品的共同特征。

DAX 是一门容易理解的语言

也就是说,DAX 和大多数编程语言不同,它更容易入门,但熟悉它的一些新概念可能需要一些时间。

如果你具有 Microsoft Excel 编程语言经验,想要学习 DAX,却不知如何开始,那么下面就给出一些 Excel 用户学习 DAX 的建议


你可能已经知道 DAX 与 Excel 公式有些相似。毕竟 DAX 脱胎于 Excel Power Pivot,其开发团队试图保持这两种语言的相似性,这使得用户向这种新语言的过渡更加容易。

然而,它们仍有一些非常重要的区别。

01

单元格和智能表格


Excel 对单元格执行计算,单元格通过坐标引用。因此,你可以这样编写公式:

= (A1 * 1.25) - B2
复制代码

DAX 则不同,单元格和坐标的概念在 DAX 中不存在。

DAX 处理的是表和列,而不是单元格。

所以,当你写 DAX 表达式时,只能引用表和列。

表和列的概念在 Excel 中司空见惯。实际上,如果将 Excel 中的某个范围定义为智能表格(使用创建表功能),那么你可以在 Excel 中编写引用表和列的表达式。

在下图中,你会看到为 SalesAmount 列计算的表达式引用了同一个表中的列,而不是工作簿中的单元格。


在 Excel 中,你可以使用[@ColumnName]格式引用表中的列,其中 ColumnName 是要引用的列的名称,@符号表示“获取当前行的值”。

虽然语法直观,但通常不会这样编写表达式,你只需要单击目标单元格,Excel 负责插入正确的代码。

你可能认为 Excel 有两种不同的计算方式:使用标准单元格引用(在这种情况下,单元格 F4 中的公式应该是 E4*D4),或者使用列引用(如果在智能表格中计算)。

使用列引用的优点是,可以在列的所有单元格中使用相同的表达式,而 Excel 为每行使用不同的值来计算公式。

与 Excel 不同,DAX 只适用于表结构,所有表达式都必须引用表中的列。例如,在 DAX 中编写这样一个乘法公式:

Sales[SalesAmount] =

Sales[ProductPrice] * Sales[ProductQuantity]
复制代码

如你所见,每个列都以表名为前缀。

在 Excel 中,不需要提供表名,因为 Excel 公式在单个表中计算。

但是在 DAX 中,则需要指定表名,因为 DAX 在包含多个表的数据模型中工作,来自不同表的两列可能具有相同的名称。

DAX 中的许多函数与其在 Excel 中的同名函数工作原理相同。

例如,IF 函数在 DAX 和 Excel 中是一样的:

Excel IF ( [@SalesAmount] > 10,1,0)

DAX IF ( Sales[SalesAmount] > 10,1,0)
复制代码

Excel 函数的语法和 DAX 的一个不同之处是引用整列的方式。你可能已经注意到,[@ ProductQuantity]中的 @表示“当前行中的值”。

当使用 DAX 时,你不需要刻意指定当前行,DAX 的默认行为是获取当前行中的值。

在 Excel 中,如果需要引用整列的值,即该列中的所有行,则可以通过删除 @符号来实现,如下图所示。


AllSales 列在所有行中的值都是相同的,因为它是 SalesAmount 列的总计。

换句话说,引用当前行中的值与引用整列的值之间存在语法差异。

DAX 则不同。

在 DAX 中,你可以这样写上图所示的 AllSales 表达式:

[AllSales]:= SUM ( Sales[SalesAmount] )
复制代码

获取列中特定行的值与将列作为一个整体使用,这两种用法之间没有语法差异。

DAX 知道你想要对列的所有值求和,因为你在聚合函数(在本例中是 SUM 函数)中使用了列名作为参数。因此,虽然 Excel 在检索数据时需要用明确的语法来区分这两种类型的数据,但 DAX 以一种自动的方式消除了歧义。对于初学者来说,这可能会让人困惑。

02

Excel 函数和 DAX:两种函数式语言


Excel 函数和 DAX 这两种语言非常相似的地方是,它们都是函数式语言。

函数式语言是由基础函数调用的表达式组成的。

在 Excel 函数和 DAX 中都没有语句、循环和跳转的概念,而这些概念在许多编程语言中都很常见。

在 DAX 中,一切都是函数表达式。

对于使用不同语言的程序员来说,DAX 的这种特性通常是一个挑战,但对于 Excel 用户来说,这一点也不奇怪。

03

使用迭代器


迭代器可能是你遇到的一个新概念。

在 Excel 中,你可能习惯于一步步地执行计算。

在前面的示例中,为了计算总销售额,创建了一列,求价格乘以数量的结果,然后将其求和以计算总销售额。这个结果很有用,例如,它可以作为计算每个产品销售额百分比的分母。

使用 DAX,可以通过使用迭代器在单个步骤中执行相同的操作。迭代器完全按照其名字表示的意思来执行:迭代整个表,并对表的每一行执行计算,最后聚合结果以生成所需的单个值。

在前面的示例中,可以使用 SUMX 迭代器计算总销售额:

[AllSales]:=

SUMX (

Sales,

Sales[ProductQuantity] * Sales[ProductPrice]

)
复制代码

这种方法既有优点也有缺点。

  • 优点是,可以在单个步骤中执行许多复杂的计算,而不必为此添加许多列,这对某些特定的公式有用。

  • 缺点是,使用 DAX 编程的直观性不如 Excel。实际上,你观察不到那个将价格和数量相乘的虚拟列,它只是短暂地存在于公式运行的时候。

你仍然可以选择创建一个计算列来计算价格和数量的乘积。

然而,这不是一个好的做法,因为它使用了更多的内存,并可能会降低计算速度,除非你使用了 DirectQuery 和聚合表。

03

DAX 相关理论


需要明确的是,学习 DAX 需要先从理论开始,这并非不同编程语言之间的区别,而是思维方式的不同。

你可能已经习惯于通过网络搜索来找到解决某个具体问题的复杂公式或方案。

当你使用 Excel 时,很可能会发现有一个公式几乎能满足你的需求。

于是,你复制这个公式,稍做修改就解决了问题,而不必考虑它的工作原理。

该方法适用于 Excel,但不适用于 DAX。在能够写出好的 DAX 表达式之前,你需要学习一些理论并彻底理解计值上下文是如何工作的。

如果没有一定的理论基础,你会觉得 DAX 像变魔术一样得到了正确的结果,或者得到没有意义的奇怪数字。但问题不在于 DAX,而是你还没有完全理解 DAX 是如何工作的。

幸运的是,DAX 的理论只限于几个重要的概念,《DAX 权威指南》一书中会进行详细介绍。

一旦你掌握了原理,DAX 对你来说就不再神秘了,学习 DAX 主要是积累经验。

然而,请不要试图走得太远,除非你很好地吸收并掌握了计值上下文。

记住:了解原理只是成功的一半。


▊《DAX 权威指南》

[意] Marco,Russo(马尔·科鲁索),Alberto,Ferrari(阿尔贝托·拉里) 著

高飞 译


  • DAX 里程碑式经典教材,亚马逊 4.8 分(总分 5 分)

  • 本书的目的,让你真正掌握 DAX!

  • 微软 MVP,Power BI 极客 翻译

  • 原书作者、DAX 之父、ExcelHome 创始人、Power BI MVP 力荐

本书是微软 DAX 语言在商业智能分析、数据建模和数据分析方面的指南。

通过对本书的学习,你将了解如何使用 DAX 语言进行商业智能分析、数据建模和数据分析;你将掌握从基础表函数到高级代码,以及模型优化的所有内容;你将确切了解在运行 DAX 表达式时,引擎内部所执行的操作,并利用这些知识编写可以高速运行且健壮的代码。

用户头像

还未添加个人签名 2019.10.21 加入

还未添加个人简介

评论

发布
暂无评论
Excel用户如何学习数据分析语言DAX?