在Power Query M中的CountIfs()等同函数,用于在自身内每行进行计数。

4
我将尝试在Power Query查询中实现类似于countifs()的逻辑,但不是在引用源表的汇总表中。相反,我想显示所有记录,并使其成为另一列(在我的实际用例中,这是必要的)。以下是我的意思...
输入数据:
ID | Animal | Color
-- | ------ | -----
 1 | Zebra  | Red
 2 | Zebra  | Blue
 3 | Zebra  | Red
 4 | Zebra  | Red

期望输出:

ID | Animal | Color | Count of others with same color
-- | ------ | ----- | -------------------------------
 1 | Zebra  | Red   | 3
 2 | Zebra  | Blue  | 1
 3 | Zebra  | Red   | 3
 4 | Zebra  | Red   | 3

在Excel内联公式中,要计算列“具有相同颜色的其他数量”,我将使用:
=COUNTIFS([Animal],[@Animal],[Color],[@Color])

我该如何使用Power Query和M语言来实现这个功能?
3个回答

5

在筛选后的表格上使用计数。


以下是自定义列的公式示例:

List.Count(
    Table.SelectRows(
        #"Previous Step Name Goes Here",
        (C) => [Animal] = C[Animal] and [Color] = C[Color]
    )[ID]
)
() => 函数构造是必要的,因为您需要引用两个不同的上下文。一个是您正在评估函数的行,另一个是您使用 Table.SelectRows 进行筛选的表的行。这一点刚开始可能会有些奇怪,所以我建议搜索 "Power Query each function" 并进行一些阅读。
注意:将 [ID] 添加到表中,通过选择单个列将其转换为列表。

如果我将“上一步名称”作为表名,那么就会出现循环引用错误,这是有道理的。因此,对于习惯于考虑电子表格而不是查询的人来说,一个重要的注意事项是它必须使用表的副本,以便它不会对自身进行操作。 - ak112358
1
是的,这就是为什么在查询中引用前一步骤而不是查询名称。您不希望出现循环依赖。 - Alexis Olson

2
与Alexis解决方案类似,但使用列表函数。
let
    Source = Excel.CurrentWorkbook(){[Name="Test"]}[Content],
    CountCol = Table.AddColumn(Source, "Count", (r) => List.Count(List.PositionOf(Source[Color],r[Color],Occurrence.All)))

in
CountCol

在"Source"表中添加了一个名为"Count"的新列。
该函数从"Source"表中获取每个记录(称为"r"),并将其传递给嵌套函数。
从内部来看,"List.PositionOf"获得三个参数:来自"Source"表的"Color"列作为列表,传递记录("r")的"Color"字段以及第三个可选参数"Occurrence.All",强制返回所有匹配项而不仅仅是第一个。
该函数的结果是另一个列表,其中包含整个颜色列表中记录的"Color"字段的所有位置。
外部函数"List.Count"只计算位置列表的元素数量,并返回一个整数。

2

以下是一个与Alexis答案略有不同、并借鉴了Daniel演示方式的版本:

let
    aTable = Excel.CurrentWorkbook(){[Name="aTable"]}[Content],
    addCol = Table.AddColumn(aTable, "Count", each Table.RowCount(Table.SelectRows(aTable,(R) => _[key] = R[key])), type number)
in
    addCol

与Alexis one的区别主要在于它不使用List.Count函数,而是直接使用Table.Rowcount,因此无需进行单列选择以将过滤后的表格转换为列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接