等同于Power Query M中的CountIfs(),自身中的每行计数

时间:2018-11-14 16:48:14

标签: excel excel-formula powerquery m

我试图在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])

我该如何使用M语言在Power Query中做到这一点?

3 个答案:

答案 0 :(得分:1)

在过滤后的表格上使用计数。


这是自定义列的公式:

List.Count(
    Table.SelectRows(
        #"Previous Step Name Goes Here",
        (C) => [Animal] = C[Animal] and [Color] = C[Color]
    )[ID]
)

由于您需要引用两个独立的上下文,因此需要() =>函数构造。一个是您要在其中评估函数的行,另一个是您要使用Table.SelectRows进行过滤的表的行。乍一看这有点奇怪,所以我建议搜索“ Power Query每个功能”并进行一些阅读。

注意:在表上附加[ID]可以通过选择单个列将其转换为列表。

答案 1 :(得分:1)

另一则与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的区别主要是不使用List.Count函数,而是直接使用Table.Rowcount,因此无需进行单列选择即可将过滤后的表转换为列表

答案 2 :(得分:0)

类似于Alexis解决方案,但使用List函数。

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

将名为“ Count”的新列添加到“源”表。

该函数从“源”表获取每个记录(名为“ r”),并将其传递给嵌套函数。

在内部,“ List.PositionOf”获得三个参数:“ Source”表中的“ Color”列作为列表,传递的记录中的“ Color”字段(“ r”)和第三个可选参数“ Occurrence.All”强制返回所有匹配项,而不仅仅是第一个匹配项。

此功能的结果是另一个列表,其中包含整个颜色列表中记录中“颜色”字段的所有位置。

外部功能“ List.Count”仅计算位置列表中的元素并返回整数。