基于子组条件的计算列

Calculated column based on subgroup condition

我需要一个基于 DAX 的解决方案:

我的Table:

Date       User       Code         Column1     
1/1/17     Karl       A            
1/1/17     Karl       B            
1/1/17     Joan       G            
1/1/17     Joan       B            
1/1/17     Maria      Z            
1/1/17     Maria      H            
1/1/17     Maria      F            

如何在 DAX 中创建循环或函数,我根据几个条件在 Column1 中填充行:

对于 [Date] 中的每个日期和 [User] 中的每个用户,如果值 "A" 或 "Z" 存在于列 [Code] 中,则将 "AUTO" 在 [Column1] 中,否则如果值 "A" 或 "Z" 在 [Code] 中不存在,则将 "NOT AUTO" 放入 [Column1] 中,如下所示:

我的Table:

Date       User       Code         Column1     
1/1/17     Karl       A            Auto
1/1/17     Karl       B            Auto
1/1/17     Joan       G            NOT Auto
1/1/17     Joan       B            Not Auto
1/1/17     Maria      Z            Auto
1/1/17     Maria      H            Auto
1/1/17     Maria      F            Auto
....       .....      .....        .....

DAX 可以解决这个问题吗?

注意:根据下面的讨论,我需要 DAX 在 Excel 2013 中运行,因此更新的功能可能不可用。

尝试以下操作(假设您的 table 被命名为 Users):

Column1 = 
    VAR AllCodes = CALCULATETABLE(VALUES(Users[Code]), ALL(Users[Code]))
    RETURN IF("A" IN AllCodes || "Z" IN AllCodes, "Auto", "NOT Auto")

变量AllCodes 计算每行中与用户和日期关联的所有代码的集合。 (请注意,我使用 CALCULATETABLE 因为我想 return 多个值。)

使用这个,我们测试 AB 是否在 AllCodes 中并相应地分配 AutoNOT Auto


如果您不能使用变量,请尝试将变量定义代入等式:

Column1 = IF("A" IN CALCULATETABLE(VALUES(Users[Code]), ALL(Users[Code])) ||
             "Z" IN CALCULATETABLE(VALUES(Users[Code]), ALL(Users[Code])),
             "Auto", "NOT Auto")

如果 IN 语法在您的旧版本 DAX 中不起作用,请按照我的建议尝试 CONTAINS

Column1 = IF(CONTAINS(CALCULATETABLE(VALUES(Users[Code]),ALL(Users[Code])), [Code], "A") ||
             CONTAINS(CALCULATETABLE(VALUES(Users[Code]),ALL(Users[Code])), [Code], "Z"),
             "Auto", "NOT Auto")

所有这三种解决方案都会在最新版本的 Power BI 桌面中重现您的示例数据。


编辑:

经过深思熟虑,我想到如果有额外的列,这可能无法按预期工作,因为需要考虑额外的行上下文。如果有额外的列,您可能希望使用 ALLEXCEPT(Users, Users[Date], Users[User]) 而不是 ALL(Users[Code])。这将删除除明确指定的行上下文(DateUser)之外的所有行上下文,而不是仅删除 Code 行上下文。