ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3778|回复: 11

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-7-3 17:20 | 显示全部楼层 |阅读模式
本帖最后由 shwangfeng 于 2019-7-3 17:34 编辑

突然想到的问题,例如有事实表与维度表各一,通过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怎么处理最好?

上附件,请大佬指点:
试验.rar (25.88 KB, 下载次数: 15)

TA的精华主题

TA的得分主题

发表于 2019-7-4 09:16 | 显示全部楼层
本帖最后由 tony@cq 于 2019-7-4 09:17 编辑

我个人理解:
1、通过ADDCOLUMNS在Fact表里新增的字段,并没有与Level表中的ID建立关系。或者说原来的关系与新增加的字段不能继续关联了(不可能从Levle的ID与Fact多个字段建立关系),与values函数去重无关
2、“从多端表查询一端表的信息”,用Relatedtable函数。


QQ图片20190704091551.png

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-4 09:47 | 显示全部楼层
tony@cq 发表于 2019-7-4 09:16
我个人理解:
1、通过ADDCOLUMNS在Fact表里新增的字段,并没有与Level表中的ID建 ...

谢谢回复!

关于第一点,不是很理解,试想如果把公式反过来,从维度表出发来汇总事实表:
  1. EVALUATE
  2. ADDCOLUMNS(VALUES('Level'[ID]),"TotalAmount",CALCULATE(SUM('Fact'[Amount])))
复制代码

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

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

TA的精华主题

TA的得分主题

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

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-4 11:01 | 显示全部楼层
mathspirt 发表于 2019-7-4 10:29
个人理解,fact前面用了values后,就不具有原来FACT的物理特性,所以无法使用related函数的,这时候可以用l ...

谢谢回复!

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

TA的精华主题

TA的得分主题

发表于 2019-7-4 14:29 | 显示全部楼层
shwangfeng 发表于 2019-7-4 11:01
谢谢回复!

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

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

点评

values破坏了扩展表的特性,related失效了  发表于 2019-7-9 18:46

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-7-9 18:50 | 显示全部楼层
写法一生效是因为有Fact表提供行上下文
写法二无效是因为单列没有不存在扩展表
related函数生效是因为扩展表的存在,关系只是表象

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

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-7-11 11:44 | 显示全部楼层
PowerBI极客 发表于 2019-7-9 18:50
写法一生效是因为有Fact表提供行上下文
写法二无效是因为单列没有不存在扩展表
related函数生效是因为扩 ...

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

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-11 13:20 | 显示全部楼层
PowerBI极客 发表于 2019-7-9 18:50
写法一生效是因为有Fact表提供行上下文
写法二无效是因为单列没有不存在扩展表
related函数生效是因为扩 ...

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

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

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-7-11 13:22 | 显示全部楼层
mathspirt 发表于 2019-7-11 11:44
高飞老师,我更好奇一个问题,圣经第二版发售了,中文版会加入第二版的内容吗?

这个我之前问过,大佬说因为翻译工作量太大,不会同步第二版。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-14 14:34 , Processed in 0.039780 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表