4.2 测试您对评估上下文的理解

测试您对评估上下文的理解

在继续进行关于评估上下文的更复杂的描述之前,使用几个示例来测试您对上下文的理解是很有用的。请不要立即查看说明;在问题之后停下来并尝试回答。然后阅读说明以使之有意义。作为提示,请在思考时记住“筛选上下文筛选;行上下文进行迭代。这意味着行上下文不会筛选,并且筛选上下文不会迭代。”

在计算列中使用SUM

第一个测试使用计算列内的聚合函数。在Sales表中,计算列中使用以下表达式的结果是什么?

Sales [SumOfSalesQuantity] = SUM(Sales [Quantity])

请记住,这在内部对应于以下等效语法:

Sales [SumOfSalesQuantity] = SUMX(Sales,Sales [Quantity])

因为它是计算列,所以它是在行上下文中逐行计算的。您希望看到什么数?从以下三个答案中选择:

  • 该行的“数量”值,即每行不同的值。
  • 所有行的数量总计,即所有行的值相同。
  • 一个错误; 我们不能在计算列内使用SUM。

请停止阅读,我们在等待您的有根据的猜测之后再继续。

这是正确的推理。您已经了解到该公式的意思是“当前过滤器上下文中所有可见行的数量之和”。此外,由于代码是针对计算列执行的,因此DAX在行上下文中逐行评估公式。但是,行上下文不会筛选表。可以筛选表的唯一上下文是筛选上下文。这就使问题变成了另一个问题:对公式求值时,筛选上下文是什么?答案很简单:筛选上下文为空。实际上,筛选上下文是通过视觉对象或查询创建的,并且当没有筛选发生时,在数据刷新时将计算出一个列。因此,SUM在整个 Sales 表上工作,为 Sales 的所有行汇总 Sales [Quantity] 的值。

正确答案是第二个答案。此计算列为每一行计算相同的值,即对所有行重复的 Sales [Quantity] 总计。图4-8显示了 SumOfSalesQuantity 计算列的结果。

图4-8 在计算列中的SUM(Sales [Quantity])是针对整个数据库计算的

此示例显示两个评估上下文同时存在,但是它们不相互作用。评估上下文都对公式的结果起作用,但是它们以不同的方式起作用。SUM,MIN和MAX之类的聚合函数仅使用筛选上下文,而忽略行上下文。如果您像许多学生通常那样选择了第一个答案,那是完全正常的。事实是,您仍在混淆筛选上下文和行上下文。记住,筛选上下文筛选;行上下文进行迭代。当使用直观逻辑时,第一个答案是最常见的,但这是错误的——现在您知道为什么了。但是,如果您选择了正确的答案……那么我们很高兴本节帮助您学习了两种情况之间的重要区别。

在度量值中使用列

第二项测试略有不同。想象一下,我们在度量中而不是在计算列中定义毛利率公式。我们有一个包含净价的列,另一个包含产品成本的列,我们编写以下表达式:

GrossMargin% := ( Sales[Net Price] - Sales[Unit Cost] ) / Sales[Unit Cost]

结果将是什么?如前所述,请从以下三个可能的答案中进行选择:

  • 该表达式可以正常工作,需要时间在报表中测试结果。
  • 一个错误,我们甚至不应该写这个公式。
  • 我们可以定义公式,但是在报表中使用时将返回错误。

与以前的测试一样,停止阅读,考虑答案,然后阅读以下说明。

该代码引用了 Sales[Net Price]Sales[Unit Cost],没有任何聚合函数。因此,DAX需要检索某行的列值。因为没有迭代发生,并且代码不在计算列中,DAX无法检测需要公式计算的行,换句话说,DAX缺少行上下文,这将使得有可能将表达式的一部分作为列值检索。记住,度量值没有自动行上下文,仅计算列才有。如果我们需要度量值中的行上下文,则应该开始迭代。

因此,第二个答案是正确的。我们不能编写公式,因为它在语法上是错误的,并且在尝试输入代码时出现错误。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 第4章了解评估上下文 4.1 介绍评估上下文 到此,您已经学习了DAX语言的基础知识。您知道如何创建计算列和度量值...
    jweishan阅读 929评论 0 1
  • 到本书的这一章时,您已经学习了DAX语言的基础知识。您知道如何创建计算列和度量值,并且您已经很好地理解了DAX中的...
    daxbi阅读 6,608评论 4 28
  • DAX圣经第二版出世后,一直想要用心读一遍查漏补缺。事实证明体系化的阅读是非常有必要的。读完第四章,对于计算上下文...
    徐胥阅读 2,274评论 0 6
  • 在迭代函数中使用行上下文 您了解到,无论何时定义计算列或使用X函数开始迭代时,DAX都会创建行上下文。当我们使用计...
    jweishan阅读 1,388评论 0 2
  • 家中某重要人物生日,白天没时间凑一起。 省略晚饭,吃夜宵。 蛋糕是需要买的,但可以小一点。 红酒不必开,可以喝酸奶...
    明心小语阅读 636评论 0 4