Power BI 中的索引和聚合函数

Posted

技术标签:

【中文标题】Power BI 中的索引和聚合函数【英文标题】:INDEX and AGGREGATE FUNCTION in Power BI 【发布时间】:2021-08-28 19:09:02 【问题描述】:

我有两个表,分别是数据和报表。

在数据表中,以下列分别为尺寸A、尺寸B和尺寸C、类型和等级。

在数据表中,我根据大小为每种类型创建了排名。 rank 列的目的是针对相同大小进行多次匹配,在这种情况下,rank 列将有助于确定匹配多个的确切类型。

在报告表中,以下列分别为尺寸 A、尺寸 B 和尺寸 C。

在两个表中,尺寸 A、尺寸 B 和尺寸 C 列是共同/关系。

我正在尝试从数据表到报告表中根据尺寸 A、尺寸 B 和尺寸 C 找出合适的类型。

数据:

TYPE SIZEA SIZEB SIZEC RANK
A6 420 600 440 11.00
A4 640 600 480 9.00
A5 890 1100 1330 2.00
A6 1335 1100 2350 1.00
A7 890 1100 390 5.00
A8 890 1100 530 3.00
A9 670 1100 540 4.00
A10 670 1100 440 6.00
A11 320 1100 440 10.00
A12 600 400 400 12.00
A13 800 600 400 8.00
A14 1000 600 500 7.00

报告:

SIZEA SIZEB SIZEC DESIRED RESULT-TYPE
400 300 140 A12
A12
250 250 160 A12
600 400 285 A12
400 300 150 A12
280 230 170 A12
320 320 320 A12
320 320 320 A12
600 400 140 A12
400 300 140 A12
400 300 140 A12
370 320 340 A12
320 240 250 A12
300 200 90 A12
400 290 140 A12

我在报告表中应用以下公式,以便根据尺寸 A、尺寸 B 和尺寸 C 获得合适的类型

=INDEX(DATA!$D$2:$D$16,AGGREGATE(15,6,(ROW(DATA!$H$2:$H$16)-1)/(DATA!$H$2:$H$16=1/(1/MAX(((DATA!$E$2:$E$16>=$B3)*(DATA!$F$2:$F$16>=$A3)+(DATA!$E$2:$E$16>=$A3)*(DATA!$F$2:$F$16>=$B3)>0)*(DATA!$G$2:$G$16>=$C3)*DATA!$H$2:$H$16))),1)) 

如何在 Power BI 中应用相同的逻辑?请有任何建议。

我正在寻找新的计算列选项。特此分享Excel文件供大家参考

https://www.dropbox.com/scl/fi/iq0gteeyazrg79q7a4tb1/AUTO-MODIFY-REQ.xlsx?dl=0&rlkey=nyyerjsg7if2dz30z9iqo6kdc

【问题讨论】:

您需要ranking 还是type?看起来很长的公式最后只返回A12,有什么错误吗? 我正在寻找类型而不是排名。 好的,我先看看能不能看懂你的公式。 我使用排名列来根据两个表中的大小获取适当的类型。示例 - 如果我们在报告表中寻找类型为第一行大小将适合从 A4 到 A14 在这种情况下,我们必须根据大小选择适当的类型。这就是我使用排名列的原因。 感谢您的支持和帮助。这是非常复杂的场景 【参考方案1】:

这是另一个公式,它会根据您当前的公式返回相同的结果,虽然它仍然是一个很长的公式,但更容易理解:

=INDEX($D$2:$D$13,MATCH(MAX(IF($G$2:$G$13<$L3,0,
IF((IF($E$2:$E$13<$K3,0,1)*IF($F$2:$F$13<$J3,0,1))+(IF($E$2:$E$13<$J3,0,1)*IF($F$2:$F$13<$K3,0,1))>0,1,0))
*$H$2:$H$13),$H$2:$H$13,0),1)

所以我将分解它来解释它是如何工作的:

第 1 部分:如果公式正在检查 Size C 的比较,如果您的数据低于表,Type 的值将为零,因此根本不会考虑因为zero times any amount 将为零

(IF($G$2:$G$13<$L3,0

Part 2:这部分会先检查Size A vs Size B的比较,如果低于表返回0并申请其他比较,然后使用If at the beginningreset结束值,因此最终值将是 0 或 1

IF((IF($E$2:$E$13<$K3,0,1)*IF($F$2:$F$13<$J3,0,1))+(IF($E$2:$E$13<$J3,0,1)*IF($F$2:$F$13<$K3,0,1))>0,1,0)

第3部分:从你计算的值来看,如果0次任何排名都是零,所以从非零排名例如12或9,它将从列表中获得最大值,大多数其中12

Max((.....)*$H$2:$H$13)

第 4 部分:索引匹配 - 最后它与您的公式第一部分相同,但您使用的是 Index row,这使其难以理解

INDEX($D$2:$D$13,MATCH(Max(...))

通过删除不必要的部分来简化您的公式:

=INDEX($D$2:$D$13,MATCH(MAX(IF($G$2:$G$13<$L4,0,
IF(($E$2:$E$13>=$K4)*($F$2:$F$13>=$J4)+($E$2:$E$13>=$J4)*($F$2:$F$13>=$K4)>0,1,0))*$H$2:$H$13),
$H$2:$H$13,0),1)

【讨论】:

【参考方案2】:

您可以向报告表中添加一个列,例如:

Desired = LOOKUPVALUE(DataR[TYPE],DataR[RANK], MAXX(FILTER(DataR, DataR[SIZEA] >= ReportR[SIZEA] && DataR[SIZEB] >= ReportR[SIZEB] && DataR[SIZEC] >= ReportR[SIZEC]), DataR[RANK]))

它首先过滤表格以找到大小大于或等于报表行的行,选择排名,然后查找类型。

结果:

【讨论】:

不,你的结果不正确,实际上问题是有些类型是A6,我想已经很接近了,虽然不确定在BI中是否可以轻松解决? 嗨。非常感谢您的帮助并提供解决方案。根据 Excel 公式结果,公式结果(您的解决方案)几乎匹配,其中一些类型不同,其中一些根据所需结果为空白。原因不同,因为我在 Excel 公式中使用了旋转选项。数据表类型A可以进入报表类型B,数据表类型B可以进入报表A。 早上好。您能否建议在您的兴奋中添加更多逻辑。 我一直很忙,所以我有空来看看这个。。 感谢您的回复。我可以等到你再次回复。你有空的时候能帮帮我吗?谢谢。

以上是关于Power BI 中的索引和聚合函数的主要内容,如果未能解决你的问题,请参考以下文章

power bi 矩阵中的自定义聚合列

数据可视化之DAX篇(二十六)Power BI度量值:滚动聚合

Power BI笔记(二)

Power BI - 值部分

为使用 Qgis 中的聚合函数连接的每个值创建索引

Power BI分页报表连接Power BI Dataset及多值参数设置