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 分:

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"