我将如何在DAX中进行左联接?当我尝试添加关系或使用左外部联接DAX函数时,出现以下错误(请参见下文)。任何想法将不胜感激!
建立关系时出错:
尝试NaturalLeftOuterJoin()时出错
作为引用,我正在尝试创建损益表的计算行。
例子:
我的表格如下:
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
可视化效果来获得所需的结果:P.S.如果确实需要在行而不是列中插入“收入/成本/利润”,则可能需要透视数据或将计算结果写为新的
Column
(而不是Measure
)。这是由于Power BI中的product limitation。