PowerBI中按日期排列的多对多关系

时间:2019-12-16 21:26:00

标签: powerbi dax

我需要能够在多对多关系表中计算度量。这是我的两个桌子:

合同表

Serial#  ContractTyp  StartDate    EndDate
A        MP           1/1/2017    1/6/2018
B        ML           10/24/2017  6/30/2020
A        ML           1/6/2018    12/30/2019
C        MU           5/15/2018   1/1/2021

性能表

Serial#  Diff  Good  Bad  Date
A        15    1     0    1/30/2017
B        -24   1     0    12/17/2017
A        57    0     1    4/22/2017
A        18    1     0    2/1/2018
C        123   0     1    9/12/2018

所以,我的测量很简单。它只是按序列号计算好百分比。

NUM_GOOD = CALCULATE(COUNTA('Performance'[Good]),'Performance[Good] IN {"1"})
NUM_BAD = CALCULATE(COUNTA('Performance'[Bad]),'Performance[Bad] IN {"1"})
PERFORMANCE_METRIC = NUM_GOOD/(NUM_BAD + NUM_GOOD)

我需要能够为每个序列号运行该性能指标,但仅在机器处于MP或MU ContractTyp的情况下才可以运行。因此,我需要它能够查看性能表中的日期,并确保日期在合同表上的序列号为MP或MU的合同表的StartDate和EndDate之间。

因此,例如,如果我想查看过去两年中带有MP或MU的ContractTyp的所有Seri​​al#的性能,我希望结果看起来如下:

Serial#  PERFORMANCE_METRIC
A        50%
B        100%
C        0%

谢谢!

3 个答案:

答案 0 :(得分:1)

下面是计算列的公式,您可以将其添加到“性能”表中以返回True / False值(请参阅您的评论)。

解释逻辑:

  1. 将序列号和日期值(来自当前记录)存储在变量中。
  2. 如果我们发现至少有1个匹配的Contract具有所需的ContractTyp和Date范围,则返回True,否则返回False。
Has Contract =
VAR vSerial = [Serial#]
VAR vDate = [Date]
RETURN
    IF (
        CALCULATE (
            COUNTROWS ( Contracts ),
            Contracts[Serial#] = vSerial,
            Contracts[ContractTyp] IN { "MP", "MU" },
            Contracts[StartDate] <= vDate,
            Contracts[EndDate] >= vDate
        ) > 0,
        TRUE (),
        FALSE ()
    )

答案 1 :(得分:0)

一种方法是在Power BI中创建一个新表,方法是将处于“序列号”,“开始日期”和“结束日期”级别的“合同”表转换为“序列号”和“日期”级别。例如,如果数据具有以下记录:

ID Type Start      End

1  MP    1/1/2019  1/2/2019

您应该将其转换为如下形式:

ID Type Date

1 MP 1/1/2019

1 MP 1/2/2019

以下链接应对此有所帮助:

https://natechamberlain.com/2018/08/08/how-to-add-rows-for-dates-between-start-and-end-dates-in-power-bi-date-range-data/

一旦表被转换,您应该能够基于序列号和日期进行简单的连接,它将是一对一的关系。然后,您可以应用所需的任何过滤器。

这里的一个警告是,数据的大小非常重要。如果“合同”表中有合理数量的记录,则可以使用,否则数据可能会爆炸。

答案 2 :(得分:0)

使用合并查询添加另一个可能的答案。无需创建关系,您可以直接合并两个表。如果您之前没有做过此操作,则可以在编辑查询窗口中访问它。使用序列号作为键合并两个表后,可以使用以下公式作为过滤器:

Filter Field = IF(Date2[Date]>=Date2[Date1.Start]&&Date2[Date]<=Date2[Date1.End],1,0)

然后,您只需在过滤器窗格中设置“过滤器字段” = 1,就可以了。希望这会有所帮助。

这里是有关合并查询的教程。该链接专门用于excel,但它也应在power bi中起作用:

https://www.powerquery.training/merge-tables/