DAX从入门到精通 5-1 理解calculate

这个章节我们继续学习DAX语言,详细的介绍一个函数:calculate。这里介绍的方法也适用于calculatetable,它返回一个表而不是一个值。为了简化,我们以calculate函数为案例学习。

你可能会好奇,我们为什么要用一整个章节来介绍一个韩少,但是这个是非常有必要的,因为这个函数的应用场景非常广。calculate是目前DAX语言中最重要,最复杂的函数。函数本身很简单,只有几个参数,但是calculate的使用场景之广,写法之复杂,让我们值得使用一整个章节来学习整个函数。

像之前章节介绍的一样,我们强烈建议你熟悉了calculate函数之后,再继续接下去阅读书的剩下部分。然后,只要你对某函数感到奇怪,计算结果和你设想的不同,返回该章节,重新读一遍。你可能就会发现一些你曾经不曾学到的新知识。

学习这个章节,我们需要有一些耐心,如果有的章节你看的很晦涩难以理解,请沉下心,细细的理解,确定你的确是理解了。

理解calculate

之前我们学过,有两种上下文:行上下文和筛选上下文。另外我们也学了我们可以使用迭代函数创建行上下文,还有使用all函数可以忽略筛选上下文。值得注意的是,all函数是忽略了筛选上下文,而不是改变它。因此,下面的函数:

[Sales Amount Margin] :=
SUMX (ALL ( Sales ),
Sales[SalesAmount] * AVERAGE ( Sales[MarginPct] )
)

all函数忽略了筛选上下文,并且返回整个表,但是它没有改变函数其他部分的上下文环境。事实上,表达式的最内部,average根据当前的筛选上下文会计算MarginPct列的平均值。DAX中有个函数可以改变筛选上下文——calculate。

学习calculate函数,我们来看一个场景。设想一下我们要建立一个如下的报表,包含了category,subcategory,还有sum_of_sales_amount

image.png

整个报表显示了每行相对于总计的百分比。我们可以使用Excel透视表功能轻易的建立这样的报表,但是我们现在要把整个百分比建立为一个度量值,以便使用者可以根据需要直接的使用。

SalesPct :=
DIVIDE (
SUM ( Sales[SalesAmount] ),
SUMX ( ALL ( Sales ), Sales[SalesAmount] )
)

分子是sum of salesamount,分母忽略了筛选上下文,总是返回总计值,无论你选择了什么。这个函数如果你不选择任何切片器,那么这个函数是正确的。但是,如果你在切片器选择了black,然后值就会错误了。百分比是18.76而不是100%,因为计算总的分母是一个更大的值。如下图:


image.png

这里的问题很好理解,我们使用了all函数,all函数忽略了筛选上下文,因此,无论你选择什么,分母总是sales表的总计值,如果你想只保留对color的筛选器,只清除category和subcategory的筛选器,all函数和迭代器函数都不是正确的选择,你需要一个更强大功能的函数,也就是calculate函数。

你可能感兴趣的:(DAX从入门到精通 5-1 理解calculate)