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 beginning
到reset
结束值,因此最终值将是 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 中的索引和聚合函数的主要内容,如果未能解决你的问题,请参考以下文章