M 语言中的 COUNTIFS 超过两个表
COUNTIFS in M language over two tables
我的objective是判断财务系统是否正确设置了某些用户
为了确定这一点,我有 table 个用户显示他们的姓名、团队、特定财务角色及其权限,类似于:
Table 姓名:USERS
| User | Team | ApprovalRole | UserGroup |
| ---- | ---- | ------------ | --------- |
| User One | ABC | <75K | APPROVER |
| User Two | ABC | <1M | APPROVER |
| User Three | ABC | <500K | BASIC |
| User Four | TRD | POA-1,000 | PO APPROVER |
| User Five | TRD | POA-50,000 | PO APPROVER |
| User Six | ZBQ | INV_APP | INVOICE APPROVER |
| User Seven | ZBQ | 0 | BASIC |
| User Eight | YHW | 0 | BASIC |
| User Nine | YHW | CEO | BASIC |
| User Ten | YHW | INVAPP | INVOICE APPROVER |
我还有一个查找-table,其中列出了我正在监视的角色的“正确”设置。下面是显示结构的示例 table:
Table 姓名:LOOKUPS
| RoleName | Team | ApprovalRole | UserGroup |
| -------- | ---- | ------------ | --------- |
| PO Approver | ABC | < | Approver |
| PO Approver | TRD | POA- | PO Approver |
| PO Approver | ZBQ | CEO | Approver |
| Invoice Approver | ZBQ | INV_APP | Invoice Approver |
| Invoice Approver | YHW | INVAPP | Invoice Approver |
我的最终目标是在 USERS table 中添加一列,用于标识是否正确设置了这些类型的用户。
方法 1
我的首选方法就像 Excel 中的 COUNTIFS。
SUM(COUNTIFS(LOOKUPS[Team],[@Team],LOOKUPS[ApprovalRole],[@ApprovalRole]),COUNTIFS(LOOKUPS[Team],[@Team],LOOKUPS[UserGroup],[@UserGroup]))
。
这将给出 0、1 或 2 分:
- 0 我可以忽略 - 它们根本没有连接到这个 activity;
- 1 是错误。他们要么拥有 ApprovalRole,要么拥有 UserGroup,但不能同时拥有两者。这些需要修复;
- 2 是通过 - 一切都很好,所以不用担心。
Q1:如果我走这条路,有人可以提供一些帮助,说明如何最好地用 M 语言编写这些公式吗?我试图从 JayKilleen 中遵循 post 但这只适用于单个比较;我需要比较 SUM 公式两个部分中的两个字段。
Q2:我理解M使用区分大小写的编码。我可以用大写字母为 LOOKUPS[UserGroup] 创建一个列。但是有没有办法将它添加到 COUNTIFS 等效公式中,所以它一步完成(COUNTIFS 将该字段读取为大写),而不是两步(第一步,转换为大写,第二步,运行 COUNTIFS) ?
Q3:如何添加通配符搜索,以便将用户一、用户二、用户四和用户五正确识别为采购订单审批人?
方法 2
我可以将两个 table 合并在一起。为此,我需要在包含 Team-UserGroup-ApprovalRole 的每个 table 上有一个 Lookup-Helper 列。
我认为这种方法不会完全奏效;这份报告将作为质量保证检查,因此需要突出处理过程中的错误。鉴于此,用户三和用户九不会被识别为具有正在进行的 activity 的有效用户组。
尽管如此:
Q4:如何添加通配符,使用户一、用户二、用户四、用户五正确识别为“采购订单审批人”?
Q5:有人可以建议如何合并两个 table 吗? LOOKUPS 上的辅助列是 = Table.AddColumn(#"Added Custom", "Helper", each [Team]&[CapitalUserGroup]&[ApprovalRole]&"*")
,其中包括 *
通配符,但是当我尝试将其与 USERS 合并时,零行匹配。如果我将其扩展到模糊匹配,用户六和用户十 returns 两个匹配项:两个发票审批人。这也无法尽可能识别用户三和用户九。
我对 M 很陌生,不知道它能做什么。我的大部分在线研究都返回了 DAX 中的结果,这没有帮助。
对于实现目标的任何指导,我将不胜感激。
如果我理解你的逻辑,我想这就可以了。
- 您正在检查以确保用户分配到的团队与有效批准和用户组相关联
- 如果我理解有误,与团队无关,请告诉我
- 加入基于Team
的两个table
- 确保对于每一个,USERS table 中的批准和用户组都以与相关 LOOKUPS table.
中相同的字符开头
请阅读评论并检查应用步骤以了解:
let
Source = Excel.CurrentWorkbook(){[Name="USERS"]}[Content],
users = Table.TransformColumnTypes(Source,
List.Transform(Table.ColumnNames(Source), each {_,type text})),
//read Lookups table
Source2 = Excel.CurrentWorkbook(){[Name="LOOKUPS"]}[Content],
lookups = Table.TransformColumnTypes(Source2,
List.Transform(Table.ColumnNames(Source2), each {_, type text})),
//join the two tables based on team
joined=Table.NestedJoin(users,"Team",lookups,"Team", "joined",JoinKind.LeftOuter),
//check for validities
validApprovalRole = Table.AddColumn(joined, "Valid Approval Role", each
let
validRoles = [joined][ApprovalRole],
foundValidRole = List.Accumulate(
validRoles,false,(state,current)=>
if state = true then true else Text.StartsWith([ApprovalRole],current,Comparer.OrdinalIgnoreCase))
in
foundValidRole, type logical),
validUserGroup = Table.AddColumn(validApprovalRole, "Valid UserGroup", each
let
validGroups = [joined][UserGroup],
foundValidGroup = List.Accumulate(
validGroups,false,(state,current)=>
if state = true then true else Text.StartsWith([UserGroup],current,Comparer.OrdinalIgnoreCase))
in
foundValidGroup, type logical),
#"Removed Columns" = Table.RemoveColumns(validUserGroup,{"joined"})
in
#"Removed Columns"
我的objective是判断财务系统是否正确设置了某些用户
为了确定这一点,我有 table 个用户显示他们的姓名、团队、特定财务角色及其权限,类似于:
Table 姓名:USERS
| User | Team | ApprovalRole | UserGroup |
| ---- | ---- | ------------ | --------- |
| User One | ABC | <75K | APPROVER |
| User Two | ABC | <1M | APPROVER |
| User Three | ABC | <500K | BASIC |
| User Four | TRD | POA-1,000 | PO APPROVER |
| User Five | TRD | POA-50,000 | PO APPROVER |
| User Six | ZBQ | INV_APP | INVOICE APPROVER |
| User Seven | ZBQ | 0 | BASIC |
| User Eight | YHW | 0 | BASIC |
| User Nine | YHW | CEO | BASIC |
| User Ten | YHW | INVAPP | INVOICE APPROVER |
我还有一个查找-table,其中列出了我正在监视的角色的“正确”设置。下面是显示结构的示例 table:
Table 姓名:LOOKUPS
| RoleName | Team | ApprovalRole | UserGroup |
| -------- | ---- | ------------ | --------- |
| PO Approver | ABC | < | Approver |
| PO Approver | TRD | POA- | PO Approver |
| PO Approver | ZBQ | CEO | Approver |
| Invoice Approver | ZBQ | INV_APP | Invoice Approver |
| Invoice Approver | YHW | INVAPP | Invoice Approver |
我的最终目标是在 USERS table 中添加一列,用于标识是否正确设置了这些类型的用户。
方法 1
我的首选方法就像 Excel 中的 COUNTIFS。
SUM(COUNTIFS(LOOKUPS[Team],[@Team],LOOKUPS[ApprovalRole],[@ApprovalRole]),COUNTIFS(LOOKUPS[Team],[@Team],LOOKUPS[UserGroup],[@UserGroup]))
。
这将给出 0、1 或 2 分:
- 0 我可以忽略 - 它们根本没有连接到这个 activity;
- 1 是错误。他们要么拥有 ApprovalRole,要么拥有 UserGroup,但不能同时拥有两者。这些需要修复;
- 2 是通过 - 一切都很好,所以不用担心。
Q1:如果我走这条路,有人可以提供一些帮助,说明如何最好地用 M 语言编写这些公式吗?我试图从 JayKilleen 中遵循 post 但这只适用于单个比较;我需要比较 SUM 公式两个部分中的两个字段。
Q2:我理解M使用区分大小写的编码。我可以用大写字母为 LOOKUPS[UserGroup] 创建一个列。但是有没有办法将它添加到 COUNTIFS 等效公式中,所以它一步完成(COUNTIFS 将该字段读取为大写),而不是两步(第一步,转换为大写,第二步,运行 COUNTIFS) ?
Q3:如何添加通配符搜索,以便将用户一、用户二、用户四和用户五正确识别为采购订单审批人?
方法 2
我可以将两个 table 合并在一起。为此,我需要在包含 Team-UserGroup-ApprovalRole 的每个 table 上有一个 Lookup-Helper 列。
我认为这种方法不会完全奏效;这份报告将作为质量保证检查,因此需要突出处理过程中的错误。鉴于此,用户三和用户九不会被识别为具有正在进行的 activity 的有效用户组。
尽管如此:
Q4:如何添加通配符,使用户一、用户二、用户四、用户五正确识别为“采购订单审批人”?
Q5:有人可以建议如何合并两个 table 吗? LOOKUPS 上的辅助列是 = Table.AddColumn(#"Added Custom", "Helper", each [Team]&[CapitalUserGroup]&[ApprovalRole]&"*")
,其中包括 *
通配符,但是当我尝试将其与 USERS 合并时,零行匹配。如果我将其扩展到模糊匹配,用户六和用户十 returns 两个匹配项:两个发票审批人。这也无法尽可能识别用户三和用户九。
我对 M 很陌生,不知道它能做什么。我的大部分在线研究都返回了 DAX 中的结果,这没有帮助。
对于实现目标的任何指导,我将不胜感激。
如果我理解你的逻辑,我想这就可以了。
- 您正在检查以确保用户分配到的团队与有效批准和用户组相关联
- 如果我理解有误,与团队无关,请告诉我
- 加入基于Team 的两个table
- 确保对于每一个,USERS table 中的批准和用户组都以与相关 LOOKUPS table. 中相同的字符开头
请阅读评论并检查应用步骤以了解:
let
Source = Excel.CurrentWorkbook(){[Name="USERS"]}[Content],
users = Table.TransformColumnTypes(Source,
List.Transform(Table.ColumnNames(Source), each {_,type text})),
//read Lookups table
Source2 = Excel.CurrentWorkbook(){[Name="LOOKUPS"]}[Content],
lookups = Table.TransformColumnTypes(Source2,
List.Transform(Table.ColumnNames(Source2), each {_, type text})),
//join the two tables based on team
joined=Table.NestedJoin(users,"Team",lookups,"Team", "joined",JoinKind.LeftOuter),
//check for validities
validApprovalRole = Table.AddColumn(joined, "Valid Approval Role", each
let
validRoles = [joined][ApprovalRole],
foundValidRole = List.Accumulate(
validRoles,false,(state,current)=>
if state = true then true else Text.StartsWith([ApprovalRole],current,Comparer.OrdinalIgnoreCase))
in
foundValidRole, type logical),
validUserGroup = Table.AddColumn(validApprovalRole, "Valid UserGroup", each
let
validGroups = [joined][UserGroup],
foundValidGroup = List.Accumulate(
validGroups,false,(state,current)=>
if state = true then true else Text.StartsWith([UserGroup],current,Comparer.OrdinalIgnoreCase))
in
foundValidGroup, type logical),
#"Removed Columns" = Table.RemoveColumns(validUserGroup,{"joined"})
in
#"Removed Columns"