如何在 Power BI Desktop 中连接多列表

How to join tables on multiple columns in Power BI Desktop

目标是创建一个视觉效果,显示一年中每个月的预算与溢价; 类似的东西:

所以我有两个 tables BudgetData 和 Premiums。 我怎样才能在两列上加入这两个 table:

    `BudgetData.InsurenceType = Premiums.Division 
and
 BudgetData .MonthYear = Premiums.MonthYear`

预算日期Table:

   InsurType         Amount     MonthYear
Commercial Auto      1000       Jan 2017
Commercial Auto      22000      Feb 2017
Commercial Auto      3000       Mar 2017
Specialty Casualty   4000       Jan 2017
Specialty Casualty   5000       Feb 2017
Specialty Casualty   35000      Mar 2017

保费Table:

Division          Premium    MonthYear
Commercial Auto      2500     Jan 2017
Commercial Auto      1800     Feb 2017
Commercial Auto      3365     Mar 2017
Specialty Casualty   14528    Jan 2017
Specialty Casualty   3323     Feb 2017
Specialty Casualty   1825     Mar 2017

在 Power BI 中,我只能加入单一关系,我不明白为什么会这样。

那么实现这一目标的最有效方法是什么?在性能方面。

更新:

乔,非常感谢你。 我能够加入。 但是当我尝试做视觉效果时,它给了我预算金额 countsum

我设置了 Don't summarize 并确保数据类型与 Premium 值(小数)相同,但仍然有这个问题。

跟join有关系吗?

更新 2:

.pibx 文件可通过保管箱获得: https://www.dropbox.com/s/mcj1gtonttjtz6y/PremiumByDivisions.pbix?dl=0

更新 3

Joe,如果我从现有的 tables PremiumsBudgetData 中创建单独的计算 table 会怎么样?列:PremiumBudgetAmountDivisionMonthYear。 像那样:

然后在我的图表中使用它。如果我点击甜甜圈图,你认为它会按部门过滤吗?

问题是我知道如何在 SQL 中创建这样的 table,但不知道如何在 DAX 中创建。 下面是t-sql代码:

;with cte_Premiums
as
(
select  sum(Premium) as Premium, 
        Division, 
        LEFT(DATENAME(MONTH,[EffectiveDate]),3) +' '+ CONVERT(varchar(4),Year(EffectiveDate)) AS MonthYear,
        MAX(DATEPART(MM, [EffectiveDate])) as DateOrder
from ##OlegTest 
group by LEFT(DATENAME(MONTH,[EffectiveDate]),3) +' '+ CONVERT(varchar(4),Year(EffectiveDate)), Division
)

,cte_Budget
AS
(
select  insurType,
        Amount, 
        LEFT(DATENAME(MONTH,[PostDate]),3) +' '+CONVERT(varchar(4),Year([PostDate])) AS MonthYear
from BudgetData
)
select  Premium, 
        Amount as BudgetAmount, 
        Division, 
        p.MonthYear
FROM    cte_Premiums p INNER JOIN cte_Budget b ON p.Division = b.insurType and p.MonthYear = b.MonthYear
ORDER BY Division,DateOrder

创建关系对话框不允许 select 多列 所以有2个解决方法 1. 在两个表上创建一个新列,连接 InsurType & MonthYear

  1. Power Query 可以连接包含您 want.First 从主页选项卡的合并部分打开合并查询的列的表,您可以一一按住 CTRL 键和 select 列(在正确的加入顺序)。

简而言之,Power BI 不支持连接两列...但我认为这不是您需要在此处解决的问题。

在不知道您的完整数据模型的情况下,我将进行一些猜测,但我希望这能为您解决问题。

我从这样的 BudgetData table 开始:

和像这样的溢价 table:

我使用 Power BI 使用以下 DAX 公式创建了一个日期 table。

Dates = CALENDAR(DATE(2017, 1, 1), DATE(2017, 12, 31))

我还使用 Power BI 使用以下 DAX 公式为 InsurType/Division 创建了一个维度 table。

InsurTypes = DISTINCT(
    UNION(
        SELECTCOLUMNS(BudgetData, "InsurType", BudgetData[InsurType]),
        SELECTCOLUMNS(Premiums, "InsurType", Premiums[Division])
    )
)

然后我创建了四个 table 之间的关系,如下所示。

由于您使用的是我没有的 MonthInCalendar 列,因此我使用以下公式创建它和排序列。

MonthInCalendar = LEFT(Dates[Date].[Month], 3) & " " & Dates[Date].[Year]

MonthInCalendarSort = Dates[Date].[Year] & Dates[Date].[MonthNo]

然后我创建了一个如下图所示配置的图表,它似乎显示了正确的信息。不需要 BudgetData 和 Premiums tables 之间的关系。

您可以 select 合并多个列。

首先将两个表(BudgetDate 和 Premiums)加载到 Power Query 中。

然后单击“主页”->“合并查询”->“合并查询为新查询”:

然后,在合并 window 的顶部部分,select 'Premiums'(在下拉列表 select 或),然后单击 'Division' 列 header,然后 按住您的 Ctrl 按钮 单击 'MonthYear' 列 header . (您会看到每列 header 旁边出现一个“1”和一个“2”...确保它们以正确的顺序出现,即 'Division 1' 和 'MonthYear 2')。

然后,在 Merge window 的下一部分,select BudgetDate(在下拉列表中 select 或者),然后单击 'InsurType' 列 header,然后 按住 Ctrl 按钮 单击 'MonthYear' 列 header。 (您会看到每列 header 旁边出现一个“1”和一个“2”...确保它们以正确的顺序出现,即 'InsurType 1' 和 'MonthYear 2')。

你的合并 window 像这样:

点击确定后,您将看到:

然后当你点击 'NewColumn' 的 header 中的这个... ... 你会得到这个:

清除 'Use original column name as prefix' 旁边的复选标记,然后单击“确定”得到: