基于子组条件的计算列
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 多个值。)
使用这个,我们测试 A
或 B
是否在 AllCodes
中并相应地分配 Auto
或 NOT 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])
。这将删除除明确指定的行上下文(Date
和 User
)之外的所有行上下文,而不是仅删除 Code
行上下文。
我需要一个基于 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 多个值。)
使用这个,我们测试 A
或 B
是否在 AllCodes
中并相应地分配 Auto
或 NOT 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])
。这将删除除明确指定的行上下文(Date
和 User
)之外的所有行上下文,而不是仅删除 Code
行上下文。