我试图在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中做到这一点?
答案 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”仅计算位置列表中的元素并返回整数。