[已解决] [DAX]为什么VALUES()处理过的列不再能用RELATED()?

  [复制链接]
查看155702 | 回复143 | 2020-9-16 06:28:57 | 显示全部楼层 |阅读模式
突然想到的问题,例如有事实表与维度表各一,通过ID关联,现在想求事实表中所有ID对应的某维度值:

写法一,使用SELECTCOLUMNS引用原始列,然后用RELATED,但因为引用的是原始列,结果表的ID会随事实表重复,可以计算:

  1. EVALUATE

  2. SELECTCOLUMNS ( 'Fact', "ID", 'Fact'[ID], "Level", RELATED ( 'Level'[Level] ) )
复制代码


写法二,使用ADDCOLUMNS配合VALUES对ID去重,此时无法使用RELATED,DAXStudio提示没有相应关系,不可计算:


  1. EVALUATE

  2. ADDCOLUMNS ( VALUES ( 'Fact'[ID] ), "Level", RELATED ( 'Level'[Level] ) )
复制代码



写法三,使用扩展表知识替换写法二中的RELATED,可以计算:

  1. EVALUATE

  2. ADDCOLUMNS (

  3.   VALUES ( 'Fact'[ID] ),

  4.   "Level", CALCULATE ( SELECTEDVALUE ( 'Level'[Level] ), CALCULATETABLE ( 'Fact' ) )

  5. )
复制代码


当然正确的写法很多,例如还可以使用扩展表的知识配合SUMMARIZE,同样可以计算:
写法四:
  1. EVALUATE

  2. SUMMARIZE ( 'Fact', 'Fact'[ID], 'Level'[Level] )
复制代码




我主要想知道写法二错在哪里,为什么经过VALUES一处理,RELATED就不能用了?跟lineage有关吗?

我的理解是RELATED只要有行上下文和关系就可以运行,ADDCOLUMNS提供了行上下文,而VALUES应该也不会破坏表间关系,所以为什么呢?

另外如果常常遇到这种需求(从多端表查询一端表的信息),用DAX怎么处理最好?

上附件,请大佬指点:
9963012216362.rar (25.88 KB, 下载次数: 0)
回复

使用道具 举报

水晶蜗牛 | 2020-9-16 06:34:57 | 显示全部楼层
我个人理解:
1、通过ADDCOLUMNS在Fact表里新增的字段,并没有与Level表中的ID建立关系。或者说原来的关系与新增加的字段不能继续关联了(不可能从Levle的ID与Fact多个字段建立关系),与values函数去重无关
2、“从多端表查询一端表的信息”,用Relatedtable函数。

9963012216361.png
回复

使用道具 举报

zwq9060 | 2020-9-16 06:42:57 | 显示全部楼层
我个人理解:
1、通过ADDCOLUMNS在Fact表里新增的字段,并没有与Level表中的ID建 ...


谢谢回复!

关于第一点,不是很理解,试想如果把公式反过来,从维度表出发来汇总事实表:
  1. EVALUATE

  2. ADDCOLUMNS(VALUES('Level'[ID]),"TotalAmount",CALCULATE(SUM('Fact'[Amount])))
复制代码


这就变成最普通的用法了,关系依然可以用(这也是CALCULATE正确计算的前提),不是吗?

关于第二点,RELATEDTABLE可是从一端查询多端的哦。
回复

使用道具 举报

yuanliwuyan | 2020-9-16 06:43:57 | 显示全部楼层
个人理解,fact[ID]前面用了values后,就不具有原来FACT[ID]的物理特性,所以无法使用related函数的,这时候可以用lookupvalue函数,至于多端查询一端,方法有很多,使用哪种看场景需求吧,这个不用纠结,或者你打开性能测试,看看哪个速度最快就用哪个
回复

使用道具 举报

ahh | 2020-9-16 06:48:58 | 显示全部楼层
个人理解,fact前面用了values后,就不具有原来FACT的物理特性,所以无法使用related函数的,这时候可以用l ...


谢谢回复!

我能理解大佬说的"物理特性"的意思,我开始的想法和这个一模一样,但是请看我三楼举的例子,如果说这个特性不在了,为什么从一到多的汇总是可以正常计算的呢?仅仅是改成从多到一,又仅仅是使用RELATED才出错,不太说得通啊。
回复

使用道具 举报

树洪 | 2020-9-16 06:54:58 | 显示全部楼层
谢谢回复!

我能理解大佬说的"物理特性"的意思,我开始的想法和这个一模一样,但是请看我三楼举的例子 ...


related使用这个函数需要有两个条件,一个是行上下文的存在,addcolumns提供了这个条件,还有一个就是物理连接的存在,否则是无法使用的,而values函数破坏了FACT[ID]的物理特性,这种物理连接就不存在了,所以方法二是错的,而你的方法三并没有需求物理连接关系的函数。related和relatedtable函数都必须有关系传递才能相互查询,否则就要用其他方式来代替了。个人理解,不保证对错
回复

使用道具 举报

dgzxg | 2020-9-16 07:01:58 | 显示全部楼层
写法一生效是因为有Fact表提供行上下文
写法二无效是因为单列没有不存在扩展表
related函数生效是因为扩展表的存在,关系只是表象

好奇你为什么对查询这么感兴趣,是纯粹研究原理吗,查询通常不是dax的主要用途
回复

使用道具 举报

老何 | 2020-9-16 07:07:58 | 显示全部楼层
写法一生效是因为有Fact表提供行上下文
写法二无效是因为单列没有不存在扩展表
related函数生效是因为扩 ...


高飞老师,我更好奇一个问题,圣经第二版发售了,中文版会加入第二版的内容吗?
回复

使用道具 举报

赤豆糊 | 2020-9-16 07:08:59 | 显示全部楼层
写法一生效是因为有Fact表提供行上下文
写法二无效是因为单列没有不存在扩展表
related函数生效是因为扩 ...


哦,单列不存在扩展表,嗯,很有道理。
看来我的理解还是浮于表面,没有把扩展表的概念真正结合到实践中来。

谢谢大佬,我是对原理有兴趣,等这个月《DAX圣经》第二版出了电子版,到时候细细多读几遍,希望能把各种似懂非懂的原理彻底弄明白,看这次目录的安排应该会讲得很透。
回复

使用道具 举报

vghao | 2020-9-16 07:16:59 | 显示全部楼层
高飞老师,我更好奇一个问题,圣经第二版发售了,中文版会加入第二版的内容吗?


这个我之前问过,大佬说因为翻译工作量太大,不会同步第二版。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则