【问题标题】:Power BI DAX Measure works for one column but not anotherPower BI DAX Measure 适用于一列,但不适用于另一列
【发布时间】:2021-04-22 04:07:01
【问题描述】:

使用下面的信息,我需要在 DAX 中创建一个名为 Table (Download a demo file here) 的新表。

我需要根据 DbEmployees 表中的合同详细信息,在“销售日期”列中找到每个员工在销售日期时的位置(“姓名”列)。如果销售日期适合给定员工的有效合同不止一份,请使用最短的合同期限。

我的问题是,下面的措施无法生成“位置”列,但对于“新值”列来说效果很好。

为什么会发生这种情况以及如何解决?

预期结果:

SaleID EmployeeID Sale Date new value Name Location
1 45643213 2021-02-04 89067445 Sally Shore 4
2 57647868 2020-04-15 57647868 Paul Bunyon 3
3 89067445 2019-09-24 57647868 Paul Bunyon 6

DbEmployees:

ID Name StartDate EndDate Location Position
546465546 Sandra Newman 2021/01/01 2021/12/31 1 Manager
546465546 Sandra Newman 2020/01/01 2020/12/31 2 Clerk
546465546 Sandra Newman 2019/01/01 2019/12/31 3 Clerk
545365743 Paul Bunyon 2021/01/01 2021/12/31 6 Manager
545365743 Paul Bunyon 2020/04/01 2020/05/01 3 Clerk
545365743 Paul Bunyon 2019/04/01 2021/01/01 6 Manager
796423504 Sally Shore 2020/01/01 2020/12/31 4 Clerk
783546053 Jack Tomson 2019/01/01 2019/12/31 2 Manager

动态销售:

SaleID EmployeeID Sale Date
1 45643213 2021/02/04
2 57647868 2020/04/15
3 89067445 2019/09/24

DynamicsContacts:

EmployeeID Name Email
45643213 Sandra Newman sandra.newman@hotmail.com
65437658 Jack Tomson jack.tomson@hotmail.com
57647868 Paul Bunyon paul.bunyon@hotmail.com
89067445 Sally Shore sally.shore@hotmail.com

动态审计:

SaleID Changed Date old value new value AuditID Valid Until
1 2019/06/08 65437658 57647868 1 2020-06-07
1 2020/06/07 57647868 89067445 2 2021-05-07
1 2021/05/07 89067445 45643213 3 2021-05-07
2 2019/06/08 65437658 57647868 4 2020-06-07
2 2020/06/07 57647868 89067445 5 2021-05-07
2 2021/05/07 89067445 45643213 6 2021-05-07
3 2019/06/08 65437658 57647868 7 2020-06-07
3 2020/06/07 57647868 89067445 8 2021-05-07
3 2021/05/07 89067445 45643213 9 2021-05-07

【问题讨论】:

    标签: powerbi dax


    【解决方案1】:

    据我所知,您的公式存在一些问题。

    首先,TableDbEmployees 之间没有任何关系,因此当您只过滤日期时,可能会导致您错误的位置。这可以通过将公式更改为:

    Location = 
    VAR CurrentContractDate = [Sale Date]
    VAR empName = [Name]
    RETURN
    VAR RespLocation =
                TOPN (
                    1,
                    FILTER(DbEmployees, DbEmployees[Name] = empName),
                    IF (
                    .....
    

    其次,您需要记住TOPN 函数可以从documentation 返回多行:

    如果在 order_by 值中在表的第 N 行存在平局,则返回所有平局行。然后,当第 N 行有平局时,该函数可能会返回多于 n 行。

    这可以通过选择表格中结果的最大值/最小值来解决:

    RETURN MAXX(SELECTCOLUMNS( RespLocation,"Location", [Location] ), [Location])
    

    最后,我不明白为什么预期结果的最后一行应该是 3,因为销售日期在位置 6 的记录内。

    完整表达:

    Location = 
    VAR CurrentContractDate = [Sale Date]
    VAR empName = [Name]
    RETURN
    VAR RespLocation =
                TOPN (
                    1,
                    FILTER(DbEmployees, DbEmployees[Name] = empName),
                    IF (
                        CurrentContractDate <= DbEmployees[EndDate]
                            && CurrentContractDate >= DbEmployees[StartDate], //Check, whether there is matching date
                        DATEDIFF ( DbEmployees[StartDate], DbEmployees[EndDate], DAY ), //If so, rank matching locations (you may want to employ a different formula)
                        MIN (  //If the location is not matching, calculate how close it is (from both start and end date)
                            ABS ( DATEDIFF ( CurrentContractDate, DbEmployees[StartDate], DAY ) ),
                            ABS ( DATEDIFF ( CurrentContractDate, DbEmployees[EndDate], DAY ) )
                        ) + 1000000 //Add a discriminating factor in case there are matching rows that should be favoured over non-matching.
                    ), 1
                )
                RETURN
                MAXX(SELECTCOLUMNS( RespLocation,"Location", [Location] ), [Location])
    

    【讨论】:

    • 你是绝对正确的。我的数据集中有一个错字。我修复了它,您的答案按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    相关资源
    最近更新 更多