Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powerbi Power BI DAX度量适用于一列,但不适用于另一列_Powerbi_Dax - Fatal编程技术网

Powerbi Power BI DAX度量适用于一列,但不适用于另一列

Powerbi Power BI DAX度量适用于一列,但不适用于另一列,powerbi,dax,Powerbi,Dax,使用下面的信息,我需要在DAX中创建一个名为table()的新表 我需要根据表DbEmployees中的合同详细信息,在“销售日期”列中找到每个员工在销售日期时的位置(“姓名”列)。如果销售日期适用于给定员工的多个有效合同,请使用最短的合同期限 我的问题是,下面的度量无法生成列“Location”,但对于列“new value”来说效果很好 为什么会发生这种情况?如何解决 预期结果: 萨利德 员工编号 销售日期 新价值 名称 位置 1. 45643213 2021-02-04 89067445

使用下面的信息,我需要在DAX中创建一个名为table()的新表

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

我的问题是,下面的度量无法生成列“Location”,但对于列“new value”来说效果很好

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

预期结果:

萨利德 员工编号 销售日期 新价值 名称 位置 1. 45643213 2021-02-04 89067445 莎莉·肖尔 4. 2. 57647868 2020-04-15 57647868 保罗·班扬 3. 3. 89067445 2019-09-24 57647868 保罗·班扬 6.
从我看来,你的公式有几个问题

首先,
Table
DbEmployees
之间没有任何关系,因此当您专门筛选日期时,可能会找到错误的位置。可通过将公式更改为:

Location = 
VAR CurrentContractDate = [Sale Date]
VAR empName = [Name]
RETURN
VAR RespLocation =
            TOPN (
                1,
                FILTER(DbEmployees, DbEmployees[Name] = empName),
                IF (
                .....
其次,您需要记住,
TOPN
函数可以从以下位置返回多行:

如果在表的第N行有一个按值排序的tie,则返回所有绑定行。然后,当在第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])
位置=
VAR CurrentContractDate=[销售日期]
VAR empName=[Name]
返回
VAR再定位=
托普恩(
1.
过滤器(DbEmployees,DbEmployees[Name]=empName),
如果(
CurrentContractDate=DbEmployees[StartDate],//检查是否有匹配的日期
DATEDIFF(DbEmployees[StartDate],DbEmployees[EndDate],DAY),//如果是,则排列匹配位置(您可能需要使用不同的公式)
MIN(//如果位置不匹配,计算距离(从开始日期到结束日期)
ABS(日期差(当前合同日期,DbEmployees[开始日期],天)),
ABS(日期差(当前合同日期,DbEmployees[结束日期],天))
)+1000000//如果存在应优先于非匹配的匹配行,则添加判别系数。
), 1
)
返回
MAXX(选择列(位置、位置、[Location])、[Location])

你完全正确。我的数据集中有一个输入错误。我把它修好了,你的答案也和预期的一样。