Power Query - 在两个表中添加列 CountIF 即 =COUNTIF(People[CityId],[@Id])

Power Query - Add Column CountIF across two tables ie =COUNTIF(People[CityId],[@Id])

我在 PowerQuery CityPeople 中有两个 table。

城市

Id, Name
 1, Brisbane
 2, Sydney
 3, Melbourne

Id, Name,  CityId
 1, Jay,   1
 2, Sam,   2
 3, Paul,  1
 4, Sarah, 3

我想向“城市”添加一列,以显示属于该城市的人数。到目前为止我有:

Table.AddColumn(City, "People.Count", each
    Table.RowCount(
        Table.SelectRows(
            People, 
            each [CityId] = [Id]
        )
    )
)

这 returns 新列中的所有零。如果我用 1 替换 [Id] 然后我得到 2.

[] 似乎引用了当前行上的值,但引用了相同的 table 上的值。有什么办法可以写成

Table.AddColumn(City, "People.Count", each 
    Table.RowCount(
        Table.SelectRows(
            People, 
            each People[CityId] = City[Id]
        )
    )
)

在 Excel 中,这将与

一样基本

=COUNTIF(People[CityId],[@Id])

然后下拉 PEOPLE 中的新列(根据附件 .xlsx)

看起来很简单,但绝对卡住了!哎呀

我会构建一个从 PEOPLE 开始的查询,然后按城市分组并计算计数。

然后我会将 CITY 查询与该新查询合并并展开计数列。

不需要代码或公式 - 它实际上比 Excel 公式更简单。

啊,现在我明白你在追求什么了。使用简单的列有一个绝妙的技巧:

= Table.AddColumn(City, "People.Count", each let Id=[Id] in Table.RowCount(Table.SelectRows(People, each [CityId] = Id)))

您需要将列名定义为变量,以便"leave"您当前"context"(人民table)。

关于如何以不同的方式写这个还有其他答案,但这里最通用的解决方案可能是删除嵌套的 each 语法。

看到您的查询可能会有所帮助

Table.AddColumn(
    City,
    "People.Count", each 
      Table.RowCount(Table.SelectRows(
        People, 
        each [CityId] = [Id])))

是这个重写版本的语法糖。在_[CityId] = _[Id]表达式中,_变量被绑定到最里面的参数,最外面的_没有被使用:

Table.AddColumn(
    City,
    "People.Count", (_) =>
      Table.RowCount(Table.SelectRows(
        People, 
        (_) => _[CityId] = _[Id])))

如果你有嵌套的 each 表达式,我会将外部 each 更改为具有真实变量名的函数,如下所示:

Table.AddColumn(
    City,
    "People.Count", (CityRow)  =>
      Table.RowCount(Table.SelectRows(
        People, 
        each [CityId] = CityRow[Id])))