Power BI 中动态变化的排名列
Posted
技术标签:
【中文标题】Power BI 中动态变化的排名列【英文标题】:Rank column in Power BI that change dynamically 【发布时间】:2019-08-05 09:51:11 【问题描述】:尝试在 Power BI Desktop 中使用 自定义视觉效果 创建组织结构图,要求显示带有过滤数据的图表,该图表由 Slicer 应用于部门列。
我遇到了自定义视觉的限制(这是合乎逻辑的),要在视觉中获得正确的图表,数据集必须有一个根节点,在我的场景中 ReportsTo
列应该是 null
以标识为根节点。
设法使用ROW_NUMBER () OVER (PARTITION BY EmpDepartment Order by EmpGrade desc
和CASE
逻辑在SQL 视图中的每个部门中创建Reportsto
列null
。但是这个已经处理过的数据,我在过滤器选择期间寻找一些东西,这样当用户在切片器自定义视觉中选择 2 个部门时不会崩溃。
我尝试在 Power BI 桌面中关注 DAX,以通过过滤数据获得基于 Grade
的排名,不幸的是,DAX 用作 Measure 而不是 计算列,并且使用IF([RANK]=1,BLANK(), ('Table'[ReportsTo]))
尝试计算列时,我无法获得预期结果
注意:Power BI Desktop - 编辑查询页面中添加了索引列
RANK =
MINX (
FILTER (
SELECTCOLUMNS (
ALLSELECTED ('Table'),
"index", 'Table'[Index],
"rank", RANKX ( ALLSELECTED ( 'Table' ), 'Table'[Grade],, DESC, DENSE )
),
[index] = MAX ( 'Table'[Index] )
),
[rank]
)
)
这是示例数据,如下表所示,当部门使用 IT (通过切片器)过滤时,EmpID
107 将是基于ReportsTo_2
列的根节点. But visual won't work when 2 departments selected.
+-----------+------------+-------+---------------+---------+--------------+
| EmpID | ReportsTo | Grade | EmpDepartment | EmpName | ReportsTo_2
+-----------+------------+-------+---------------+---------+--------------+
| 101 | 107 | A1 | IT | Emp1 | 107
| 102 | 107 | A1 | IT | Emp2 | 107
| 103 | 107 | A1 | IT | Emp3 | 107
| 104 | 108 | A2 | Proc. | Emp1 | 108
| 105 | 108 | A2 | Proc. | Emp1 | 108
| 106 | 108 | A2 | Proc. | Emp1 | 108
| 107 | 109 | B1 | IT | Mgr1 |
| 108 | 109 | B1 | Proc. | Mgr2 |
| 109 | 110 | C2 | Management | Director|
| 110 | | D9 | Sr.Management | CEO |
+-----------+------------+-------+---------------+---------+--------------+
预期结果:我的想法是在过滤数据(按部门过滤)中获得ReportsTo_2
列中最高Grade
的null
值。
感谢您提出的实现这一目标的建议。谢谢
根据 cmets 的要求提供更多说明信息
使用以下视觉效果:Custom Visual 1Custom Visual 2
场景:
-
当过滤多个部门(没有可用的根节点)时,如果我使用
ReportsTo_2
作为父级,则会显示错误“多个根节点”:Image Link
在部门应用 NO 过滤器时:Image Link
与自定义视觉 2 相同的场景:
-
Image Link
Image Link
补充说明 2: 我遇到的主要问题,作为 Measure 我们可以轻松获得预期结果,但作为 Calculated Column 相同的表达式不会给出预期结果。Image Link
【问题讨论】:
度量可以动态工作,计算列不能。所以你说视觉崩溃,这不是你真正的问题吗? 我同意,但在这种情况下,我不这么认为,只要过滤后的数据集具有根节点,视觉效果就可以了。在这一点上,我不期待视觉上的修复。 如果 IT 和 Proc.部门选择?我无法在不知道您尝试使用的视觉效果的情况下推导出它。不过听起来像是一个可以解决的问题。 您是否尝试过测量:RANKX (ALLSELECTED (Table), Table[Grade],, DESC, DENSE) 列不能是动态的。您可以在表格等可视化上使用这样的度量来模拟列。 亲爱的@Nacho 我已经尝试过了,但这会给我基于整个表的 RANK,要求是仅获取过滤数据的 RAN,并在 IF 条件下使用 RANK 替换最高评分为空 【参考方案1】:我想我了解您的问题,您需要的衡量标准如下。但是请注意您的视觉效果的限制。他们都明确需要一个起始节点。不允许有多个或没有起始节点。因此,即使采用此措施,也要同时选择 IT 和 Proc。在您的过滤器中将导致错误,因为它为两个视觉对象提供了两个可能的起始节点。此措施将解决没有起始节点的问题,因为它总是会导致您的 ReportsTo_2 中至少有一个空白值。
您可以在明确需要时将“”替换为 BLANK(),我没有在视觉效果上进行测试。
ReportsTo_2 =
var _highestSelectedRank = CALCULATE( MAX ( 'Table'[Grade] ) ; ALLSELECTED( 'Table' ) )
RETURN
IF (
MAX( 'Table'[Grade] ) = _highestSelectedRank ;
"" ;
MAX ( 'Table'[ReportsTo] )
)
基于 cmets 更新:或强制度量表现得像计算列
ReportsTo_2 =
var _highestSelectedRank = CALCULATE( MAX ( 'Table'[Grade] ) ; ALLSELECTED( 'Table' ) )
RETURN
MAXX (
'Table' ;
IF (
'Table'[Grade] = _highestSelectedRank ;
"" ;
'Table'[ReportsTo]
)
)
【讨论】:
我认为这个表达式的目的是得到与 ReportsTo_2 = IF([RANK] = 1, BLANK(), MAX('Table'[ReportsTo] ))。不幸的是,在我的情况下,测量无济于事,请查看已编辑的帖子。谢谢! 不可能像@Aldert 之前指出的那样创建动态计算列。它们在刷新时被计算并且它们的值是固定的。您可以尝试的唯一解决方法是使用强制行上下文的措施,请在几分钟后查看我的更新。如果这不起作用,恐怕我无法帮助您找到解决问题的方法。 同样,当我添加为 Measure 时,表达式有效,但当添加相同的表达式为 Calculated Column 时,表达式无效。我认为我必须考虑自定义视觉的限制(它可以接受 measures),并提出此报告标记限制它仅适用于我可以在 T-SQL 中轻松管理的单部门过滤器SQL 视图是实际的数据源。 我只是想知道(如果错了,请纠正我),我们是否可以设法在变量表达式中编码SELECTEDVALUE('Table'[EmpDepartment])
,以便在过滤数据中填充最高等级的变量!跨度>
实际代码无关紧要,这里是导致问题的输出。我们尝试做的事情只能在度量中完成,而您的视觉对象只接受计算的列。如果无法更改您的视觉接受的内容,那么鉴于这些限制,您所要求的确切内容是不可能的。您是否尝试运行上述代码的第二个版本作为度量并将其添加到视觉对象中?它不会作为计算列运行,因为它以不同的方式进行评估。以上是关于Power BI 中动态变化的排名列的主要内容,如果未能解决你的问题,请参考以下文章