Excel CountIfs()等效于幂查询M,在self中每行计数

Excel CountIfs()等效于幂查询M,在self中每行计数,excel,excel-formula,powerquery,m,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 o

我试图在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中执行此操作?

使用筛选表上的计数


以下是自定义列的公式:

List.Count(
    Table.SelectRows(
        #"Previous Step Name Goes Here",
        (C) => [Animal] = C[Animal] and [Color] = C[Color]
    )[ID]
)
由于需要引用两个单独的上下文,因此需要构建
()=>
函数。一个是您在其中评估函数的行,另一个是您使用
table筛选的表的行。选择rows
。乍一看,这有点奇怪,所以我建议搜索“powerqueryeach function”并进行一些阅读


注意:在表中添加
[ID]
可以通过选择一列将其转换为列表。

类似于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
名为“Count”的新列添加到“Source”表中

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

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

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


outter函数“List.Count”只对位置列表中的元素进行计数,并返回一个整数。

另一个函数与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
,因此无需进行单列选择,以便将过滤后的表转换为列表

,如果我使用#“上一步名称在此”,表名,我得到了一个循环参考误差,这是有意义的。因此,一个重要的注意事项(对于习惯于考虑电子表格而不是查询的人来说)是,它必须使用表的副本,这样它就不会对自身产生影响。是的,这就是为什么您在查询中引用前一步,而不是查询的名称。你不想要循环依赖。