在PowerBI中使用DAX进行左外连接(多对多关系)

Fir*_*per 5 sql join business-intelligence dax powerbi

我如何在DAX中进行左连接?当我尝试添加关系或使用左外连接DAX函数时,我得到以下错误(见下文).任何想法将不胜感激!

创建关系时出错: 您无法在这两列之间创建关系,因为其中一列必须具有唯一值.

尝试NaturalLeftOuterJoin()时出错 未检测到公共连接列. 连接函数'NATURALLEFTOUTERJOIN'至少需要一个公共连接列.

作为参考,我正在尝试创建损益表的计算行.

例:

  • 收入: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  ?
????????????????????????????????????

在SQL中,这非常简单 - 我只在AccountID字段上执行左外连接,为Profit行创建记录,如下所示:

 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]
Run Code Online (Sandbox Code Playgroud)

结果:

???????????????????????????????????????????????????????????????????????????????
? 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  ?
???????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

然后我可以像这样转动它:

???????????????????????????????
?  Line   ? Store A ? Store B ?
???????????????????????????????
? Revenue ?     120 ?     350 ?
? Cost    ?     -50 ?     -70 ?
? Profit  ?      70 ?     280 ?
???????????????????????????????
Run Code Online (Sandbox Code Playgroud)

在DAX中,它看起来要复杂得多 - 希望有人可以证明我错了!我读过双向过滤可能允许多对多关系,但我无法让它在这里工作.我尝试这样做的原因是加入DAX而不是SQL,因为我有几个语句模板,如果可以通过DAX动态完成,则不希望多个加载具有非常相似的数据.谢谢!

Fox*_* Ng 2

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

如果没有,你可以简单地在DAX中编写一些Measure来在Power BI中进行计算(这正是Power BI的强大之处),并且只Fact需要表格。

德国DAX指数:

收入:

Revenue = 
CALCULATE(
    SUM('Fact'[Amount]),
    FILTER(
        'Fact',
        'Fact'[Amount] > 0
    )
)
Run Code Online (Sandbox Code Playgroud)

成本:

Cost = 
CALCULATE(
    SUM('Fact'[Amount]),
    FILTER(
        'Fact',
        'Fact'[Amount] < 0
    )
)
Run Code Online (Sandbox Code Playgroud)

利润:

Profit = [Revenue] + [Cost]
Run Code Online (Sandbox Code Playgroud)

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

结果

PS 如果您确实需要将收入/成本/利润放在行而不是列中,则可能需要旋转数据或将计算写入新的Column(但不是Measure)。这是由于Power BI 中的产品限制造成的。