DAX从入门到精通 5-7 介绍allselected函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DAX从入门到精通 5-7 介绍allselected函数相关的知识,希望对你有一定的参考价值。
参考技术A allselect是个很有效的函数,它可以只使用透视表上的页面筛选器和切片器,来计算值。例如,我们建立如下的一个透视表。这个报表里面,我们显示了当前行对应的产品的销售占总额的百分比。这里比较困难的地方是product color同时使用于行以及切片器。按照我们现有的知识,我们会这样写函数。
使用all函数,我们移除了color字段上的筛选器。但是,all函数会移除来自于所有筛选器的筛选条件,即来自与行以及切片器,导致了结果的错误。下面的透视表中,我们可以看到结果,这里总计不是100%,而是一个更小的数值。
这个问题的是,即使用户选择的是部分的颜色,分母计算的还是所有产品的总和。但是对于每一行,你计算百分比的时候,每行除的值都是大于当前选择的颜色的总和。
所以,我们需要的是只显示选择的颜色的值的总和,而不是所有颜色的产品的值的和。我们把这种计算称为在可见情况下的计算,也就是可以按用户所选来计算总额。这里我们使用的函数是allselected。我们按这个函数来计算:
这个函数的结果,初步来看,是正确的。
allselected只返回筛选器选择的行的值。换句话说,也就是allselect忽略了透视表行列上的筛选条件,返回总的值。
allselected的参数可以使用下面三种不同的方式:
单一的列,例如allselected(product[color]),只返回选择的color的总额。
整个表,allselected返回表所选择的所有行。
没有参数,即allselected(),返回可见所有表的全部记录。
通过allselected可以动态的计算百分数和比率。在第10章中,我们会深入的讨论allselected,揭示一些更深更复杂的知识。
DAX从入门到精通 5-1 理解calculate
参考技术A 这个章节我们继续学习DAX语言,详细的介绍一个函数:calculate。这里介绍的方法也适用于calculatetable,它返回一个表而不是一个值。为了简化,我们以calculate函数为案例学习。你可能会好奇,我们为什么要用一整个章节来介绍一个韩少,但是这个是非常有必要的,因为这个函数的应用场景非常广。calculate是目前DAX语言中最重要,最复杂的函数。函数本身很简单,只有几个参数,但是calculate的使用场景之广,写法之复杂,让我们值得使用一整个章节来学习整个函数。
像之前章节介绍的一样,我们强烈建议你熟悉了calculate函数之后,再继续接下去阅读书的剩下部分。然后,只要你对某函数感到奇怪,计算结果和你设想的不同,返回该章节,重新读一遍。你可能就会发现一些你曾经不曾学到的新知识。
学习这个章节,我们需要有一些耐心,如果有的章节你看的很晦涩难以理解,请沉下心,细细的理解,确定你的确是理解了。
之前我们学过,有两种上下文:行上下文和筛选上下文。另外我们也学了我们可以使用迭代函数创建行上下文,还有使用all函数可以忽略筛选上下文。值得注意的是,all函数是忽略了筛选上下文,而不是改变它。因此,下面的函数:
all函数忽略了筛选上下文,并且返回整个表,但是它没有改变函数其他部分的上下文环境。事实上,表达式的最内部,average根据当前的筛选上下文会计算MarginPct列的平均值。DAX中有个函数可以改变筛选上下文——calculate。
学习calculate函数,我们来看一个场景。设想一下我们要建立一个如下的报表,包含了category,subcategory,还有sum_of_sales_amount
整个报表显示了每行相对于总计的百分比。我们可以使用Excel透视表功能轻易的建立这样的报表,但是我们现在要把整个百分比建立为一个度量值,以便使用者可以根据需要直接的使用。
分子是sum of salesamount,分母忽略了筛选上下文,总是返回总计值,无论你选择了什么。这个函数如果你不选择任何切片器,那么这个函数是正确的。但是,如果你在切片器选择了black,然后值就会错误了。百分比是18.76而不是100%,因为计算总的分母是一个更大的值。如下图:
这里的问题很好理解,我们使用了all函数,all函数忽略了筛选上下文,因此,无论你选择什么,分母总是sales表的总计值,如果你想只保留对color的筛选器,只清除category和subcategory的筛选器,all函数和迭代器函数都不是正确的选择,你需要一个更强大功能的函数,也就是calculate函数。
以上是关于DAX从入门到精通 5-7 介绍allselected函数的主要内容,如果未能解决你的问题,请参考以下文章