我将如何在DAX中进行左联接?当我尝试添加关系或使用左外部联接DAX函数时,出现以下错误(请参见下文)。任何想法将不胜感激!

建立关系时出错:
sql - 在Power BI中使用DAX进行左外部联接(多对多关系)-LMLPHP

尝试NaturalLeftOuterJoin()时出错
sql - 在Power BI中使用DAX进行左外部联接(多对多关系)-LMLPHP

作为引用,我正在尝试创建损益表的计算行。
例子:

  • 收入:100
  • 费用:80
  • 利润:20(收入成本)

  • 我的表格如下:
    Fact table:
    ╔═══════════╦═════════╦═══════════╦════════╗
    ║ YearMonth ║ StoreID ║ AccountID ║ Amount ║
    ╠═══════════╬═════════╬═══════════╬════════╣
    ║ 2017-01   ║ A       ║         1 ║    100 ║
    ║ 2017-01   ║ B       ║         1 ║    200 ║
    ║ 2017-01   ║ A       ║         2 ║    -50 ║
    ║ 2017-01   ║ B       ║         2 ║    -50 ║
    ║ 2017-02   ║ A       ║         1 ║     20 ║
    ║ 2017-02   ║ B       ║         1 ║    150 ║
    ║ 2017-02   ║ B       ║         2 ║    -20 ║
    ╚═══════════╩═════════╩═══════════╩════════╝
    
    Template table:
    ╔════════════╦═══════════╦═════════╗
    ║ TemplateID ║ AccountID ║  Line   ║
    ╠════════════╬═══════════╬═════════╣
    ║        105 ║         1 ║ Revenue ║
    ║        105 ║         2 ║ Cost    ║
    ║        105 ║         1 ║ Profit  ║
    ║        105 ║         2 ║ Profit  ║
    ╚════════════╩═══════════╩═════════╝
    

    In SQL this is super easy - I just do a left outer join on the AccountID field which creates records for the Profit line, like below:

     SELECT
           f.[YearMonth]
          ,f.[StoreID]
          ,f.[AccountID]
          ,f.[Amount]
          ,t.[TemplateID]
          ,t.[AccountID]
          ,t.[Line]
      FROM [dbo].[Fact] f
      left join [dbo].[Templates] t
      on f.[AccountID] = t.[AccountID]
    

    结果:
    ╔═══════════╦═════════╦═══════════╦════════╦════════════╦═══════════╦═════════╗
    ║ YearMonth ║ StoreID ║ AccountID ║ Amount ║ TemplateID ║ AccountID ║  Line   ║
    ╠═══════════╬═════════╬═══════════╬════════╬════════════╬═══════════╬═════════╣
    ║ 2017-01   ║ A       ║         1 ║    100 ║        105 ║         1 ║ Revenue ║
    ║ 2017-01   ║ B       ║         1 ║    200 ║        105 ║         1 ║ Revenue ║
    ║ 2017-02   ║ A       ║         1 ║     20 ║        105 ║         1 ║ Revenue ║
    ║ 2017-02   ║ B       ║         1 ║    150 ║        105 ║         1 ║ Revenue ║
    ║ 2017-01   ║ A       ║         2 ║    -50 ║        105 ║         2 ║ Cost    ║
    ║ 2017-01   ║ B       ║         2 ║    -50 ║        105 ║         2 ║ Cost    ║
    ║ 2017-02   ║ B       ║         2 ║    -20 ║        105 ║         2 ║ Cost    ║
    ║ 2017-01   ║ A       ║         1 ║    100 ║        105 ║         1 ║ Profit  ║
    ║ 2017-01   ║ B       ║         1 ║    200 ║        105 ║         1 ║ Profit  ║
    ║ 2017-02   ║ A       ║         1 ║     20 ║        105 ║         1 ║ Profit  ║
    ║ 2017-02   ║ B       ║         1 ║    150 ║        105 ║         1 ║ Profit  ║
    ║ 2017-01   ║ A       ║         2 ║    -50 ║        105 ║         2 ║ Profit  ║
    ║ 2017-01   ║ B       ║         2 ║    -50 ║        105 ║         2 ║ Profit  ║
    ║ 2017-02   ║ B       ║         2 ║    -20 ║        105 ║         2 ║ Profit  ║
    ╚═══════════╩═════════╩═══════════╩════════╩════════════╩═══════════╩═════════╝
    

    然后,我可以像这样旋转它:
    ╔═════════╦═════════╦═════════╗
    ║  Line   ║ Store A ║ Store B ║
    ╠═════════╬═════════╬═════════╣
    ║ Revenue ║     120 ║     350 ║
    ║ Cost    ║     -50 ║     -70 ║
    ║ Profit  ║      70 ║     280 ║
    ╚═════════╩═════════╩═════════╝
    

    在DAX中,似乎要复杂得多-希望有人能证明我做错了!我已经阅读了双向过滤可能允许多对多关系,但是我无法使其在这里工作。我之所以尝试在DAX中而不是在SQL中进行连接,是因为我有多个语句模板,并且如果可以通过DAX动态完成,则不希望对非常相似的数据进行多次加载。谢谢!

    最佳答案

    除了作为计算的虚拟对象外,是否有其他原因需要Template表?因为仅从样本数据中,我看到事实表被不必要地重复了(7-> 14行)(也许我遗漏了一些关键点)。

    如果没有,您只需在DAX中编写一些Measures即可在Power BI中进行计算(这正是Power BI的功能),并且只需要Fact表。

    DAX:

    收入:

    Revenue =
    CALCULATE(
        SUM('Fact'[Amount]),
        FILTER(
            'Fact',
            'Fact'[Amount] > 0
        )
    )
    

    成本:
    Cost =
    CALCULATE(
        SUM('Fact'[Amount]),
        FILTER(
            'Fact',
            'Fact'[Amount] < 0
        )
    )
    

    利润:
    Profit = [Revenue] + [Cost]
    

    然后,您可以使用Matrix可视化效果来获得所需的结果:

    sql - 在Power BI中使用DAX进行左外部联接(多对多关系)-LMLPHP

    P.S.如果确实需要在行而不是列中插入“收入/成本/利润”,则可能需要透视数据或将计算结果写为新的Column(而不是Measure)。这是由于Power BI中的product limitation

    10-08 08:48