基于子组条件计算的列

时间:2018-02-09 05:16:57

标签: excel excel-2013 dax calculated-columns powerquery

我需要一个基于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中运行,因此可能无法使用更新的功能。

1 个答案:

答案 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因为我想返回多个值。)

使用此功能,我们会测试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桌面中重现您的示例数据。

Power BI

修改

经过反思,我发现如果有其他列,这可能无法正常工作,因为会有其他行上下文需要考虑。如果还有其他列,您可能希望使用ALLEXCEPT(Users, Users[Date], Users[User])而不是ALL(Users[Code])。这将删除除明确指定的行(DateUser)之外的所有行上下文,而不是仅删除Code行上下文。