我需要一个基于DAX的解决方案:
我的表:
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]
中,如下所示:
我的表:
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中运行,因此可能无法使用更新的功能。
答案 0 :(得分:2)
尝试以下方法(假设您的表名为Users
):
Column1 =
VAR AllCodes = CALCULATETABLE(VALUES(Users[Code]), ALL(Users[Code]))
RETURN IF("A" IN AllCodes || "Z" IN AllCodes, "Auto", "NOT Auto")
变量AllCodes
计算与用户关联的所有代码的集合以及每行中的日期。 (请注意,我使用CALCULATETABLE
因为我想返回多个值。)
使用此功能,我们会测试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
行上下文。