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

Posted 博文视点

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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表达式时,引擎内部所执行的操作,并利用这些知识编写可以高速运行且健壮的代码。

以上是关于Excel用户如何学习数据分析语言DAX?的主要内容,如果未能解决你的问题,请参考以下文章

Power Pivot 系列 (4) - DAX 查询

数据可视化之DAX篇(十四)DAX函数:RELATED和RELATEDTABLE

数据可视化之powerBI技巧基于SQL思维的PowerBI DAX实战

DAX权威指南 1.4-2 DAX是一种函数式语言

如何编写DAX表达式创建透视表

需要帮助将继承的 excel 公式转换为 SQL 或 DAX