在 Power BI Desktop 中套用多對多關聯性

使用 Power BI Desktop 中多對多基數的關聯性,您可以聯結使用多對多基數的數據表。 您可以更輕鬆地且直覺地建立包含兩個或多個數據源的數據模型。 與多對多基數的 關聯性是Power BI Desktop中較大型 複合模型 功能的一部分。 如需複合模型的詳細資訊,請參閱在Power BI Desktop中使用複合模型

Screenshot of a many-to-many relationship in the Edit relationship pane.

與多對多基數的關聯性如何解決

在使用 多對多基數關聯 性之前,Power BI 中定義了兩個數據表之間的關聯性。 至少涉及關聯性的其中一個數據表數據行必須包含唯一值。 不過,通常沒有任何數據行包含唯一值。

例如,兩個數據表可能有標示為 CountryRegion 的數據行。 不過,CountryRegion 的值在任一個數據表中都不是唯一的。 若要聯結這類數據表,您必須建立因應措施。 其中一個因應措施可能是引進具有所需唯一值的額外數據表。 透過 多對多基數的關聯性,如果您使用 多對多基數的關聯性,則可以直接聯結這類數據表。

搭配多對多基數使用關聯性

當您在 Power BI 中定義兩個資料表之間的關聯性時,您必須定義關聯性的基數。 例如,ProductSales 與 Product 之間的關聯性,使用 ProductSales[ProductCode] 和 Product[ProductCode] 數據行之間的關聯性會定義為 Many-1。 我們會以這種方式定義關聯性,因為每個產品都有許多銷售,而且 Product 數據表 (ProductCode) 中的數據行是唯一的。 當您將關聯基數定義為 Many-1、1-Many1-1 時,Power BI 會驗證它,因此您選取的基數符合實際數據。

例如,請查看此影像中的簡單模型:

Screenshot of ProductSales and Product table in Relationship view.

現在,假設 Product 資料表只會顯示兩個數據列,如下所示:

Screenshot of a Product table visual with two rows.

也假設 Sales 數據表只有四個數據列,包括產品 C 的數據列。由於引用完整性錯誤,product C 數據列不存在於 Product 數據表中

Screenshot of a Sales table visual with four rows.

ProductName 和 Price(來自 Product 數據表),以及每個產品的 Qty 總計(來自 ProductSales 數據表),會顯示如下:

Screenshot of a Visual displaying the product name, price, and quantity.

如上圖所示,空白 ProductName 數據列與產品 C 的銷售相關聯。此空白資料列會考慮下列考慮:

  • ProductSales 數據表中沒有任何對應數據列存在於 Product 數據表中的任何數據列。 如我們在此範例中針對產品 C 所見,有引用完整性問題。

  • ProductSales 數據表中外鍵數據行為 Null 的任何數據列。

基於這些原因,這兩種情況下的空白數據列都屬於 ProductNamePrice 未知的銷售

有時候數據表會聯結兩個數據行,但兩個數據行都不是唯一的。 例如,請考慮下列兩個數據表:

  • Sales 數據表會依 State 顯示銷售數據,而每個數據列都包含該狀態中銷售類型的銷售金額。 狀態包括 CA、WA 和 TX。

    Screenshot of a Sales table displaying sales by state.

  • CityData 數據表會顯示城市的數據,包括人口和州(例如 CA、WA 和紐約)。

    Screenshot of a Sales table displaying city, state, and population.

State 的數據行現在都在這兩個數據表中。 建議您依州/州和每個州的總人口來報告總銷售額是合理的。 不過,存在問題:狀態數據行在任一數據表中並不是唯一的。

先前的因應措施

在 Power BI Desktop 2018 年 7 月版本之前,您無法在這些數據表之間建立直接關聯性。 常見的因應措施是:

  • 建立只包含唯一狀態標識碼的第三個數據表。 資料表可以是任何或全部:

    • 計算數據表(使用數據分析表達式[DAX] 定義)。
    • 以 Power Query 編輯器 中所定義的查詢為基礎的數據表,可顯示從其中一個數據表繪製的唯一標識符。
    • 合併的完整集合。
  • 然後使用一般多 1 關聯性,將這兩個原始數據表與該新數據表產生關聯。

您可以讓因應措施數據表保持可見。 或者,您可能會隱藏因應措施數據表,使其不會出現在 [欄位 ] 清單中。 如果您隱藏數據表, 則多對1 關聯性通常會設定為雙向篩選,而且您可以使用任一數據表中的 [狀態] 字段。 後者的交叉篩選會傳播至另一個數據表。 下圖顯示該方法:

Screenshot of a hidden State table in Relationship view.

顯示 State 的視覺效果(來自 CityData 數據表),以及總 人口 和總 銷售額,然後會顯示如下:

Screenshot showing a table with State, Population, and Sales data.

注意

由於 CityData 數據表的狀態會用於此因應措施中,因此只會列出該數據表中的狀態,因此會排除 TX。 此外,不同於 多對 1 關聯性,雖然總數據列包含所有 Sales(包括 TX 的關聯 性),但詳細數據不包含涵蓋這類不相符數據列的空白數據列。 同樣地,沒有空白數據列會涵蓋Sales,其中 State 有 Null 值

假設您也會將 City 新增至該視覺效果。 雖然已知每個城市的人口,但針對 City 顯示的 Sales 只會重複對應的銷售。 當數據行群組與某些匯總量值無關時,通常會發生此案例,如下所示:

Screenshot of a table showing State and city population and sales.

假設您在這裡將新的 Sales 資料表定義為所有狀態的組合,並讓它顯示在 [欄位 ] 清單中。 相同的視覺效果會顯示 State (在新數據表上)、人口總數總銷售額

Screenshot of a visual showing State, population, and sales visual.

如您所見,TX 會包含銷售數據但未知母體數據,以及具有已知數據但不含銷售數據的紐約。 此因應措施並非最佳,而且有許多問題。 對於與多對多基數的關係,產生的問題會解決,如下一節所述。

如需實作此因應措施的詳細資訊,請參閱 多對多關聯性指引

使用與多對多基數的關聯性,而不是因應措施

您可以直接關聯數據表,例如我們稍早所述的數據表,而不必採用類似的因應措施。 現在可以將關聯基數設定為 多對多。 此設定表示兩個數據表都沒有包含唯一值。 針對這類關聯性,您仍然可以控制哪些數據表會篩選另一個數據表。 或者,您可以套用雙向篩選,其中每個數據表都會篩選另一個數據表。

在 Power BI Desktop 中,基數在判斷兩個數據表都沒有包含關聯性數據行的唯一值時,預設為 多對多 。 在這種情況下,警告訊息會確認您想要設定關聯性,而且變更不是數據問題的意外效果。

例如,當您直接在 CityData 和 Sales 之間建立關聯性時,其中篩選應該從 CityData 流向 Sales—Power BI Desktop 會顯示 [ 編輯關聯性 ] 對話框:

Screenshot of the Edit relationship dialog box with Cardinality and Cross filter direction highlighted.

產生的 [關聯性 ] 檢視接著會顯示兩個數據表之間的直接多對多關聯性。 數據表在 [ 欄位 ] 清單中的外觀,以及在建立視覺效果時的行為,類似於我們套用因應措施時的行為。 在因應措施中,顯示不同狀態數據的額外數據表不會顯示。 如先前所述,會顯示顯示 狀態母體銷售 數據的視覺效果:

Screenshot of a State, Population, and Sales table.

關聯性與多對多基數之間的主要差異,以及較典型的多對 1 關聯性,如下所示:

  • 顯示的值不包含空白數據列,該數據列會說明其他數據表中不相符的數據列。 此外,這些值不會考慮其他數據表中關聯性中使用的數據行為 null 的數據列。

  • 您無法使用 函 RELATED() 式,因為多個數據列可能相關。

  • 在數據表上使用函 ALL() 式並不會移除依多對多關聯性套用至其他相關數據表的篩選條件。 在上述範例中,定義如下的量值不會移除相關 CityData 數據表中數據行的篩選:

    Screenshot of a script example. The example is, Sales total = Calculate(Sum('Sales'[Sales]), All('Sales')).

    顯示 [狀態]、[銷售] 和 [銷售總數據] 的視覺效果會導致此圖形:

    Screenshot of a table visual showing State, Sales, and Sales total resulting from the formula.

考慮到上述差異,請確定使用 ALL(<Table>)的計算會傳回預期的結果,例如 總計的百分比。

考量與限制

此版本的 關聯性與多對多基數 和複合模型有一些限制。

下列 Live 連線 (多維度) 來源無法與複合模型搭配使用:

  • SAP HANA
  • SAP Business Warehouse
  • SQL Server Analysis Services
  • Power BI 語意模型
  • Azure Analysis Services

當您使用 DirectQuery 連線到這些多維度來源時,您無法連線到另一個 DirectQuery 來源,或將它與匯入的數據結合。

當您搭配多對多基數使用關聯性時,使用 DirectQuery 的現有限制仍然適用。 根據數據表的儲存模式,現在每個數據表都有許多限制。 例如,匯入數據表上的匯出數據行可以參考其他數據表,但 DirectQuery 數據表上的匯出數據行仍只能參考相同數據表上的數據行。 如果模型內的任何數據表是 DirectQuery,則其他限制適用於整個模型。 例如,如果模型內的任何數據表具有 DirectQuery 的儲存模式,QuickInsights 和 Q&A 功能就無法使用。

如需複合模型和 DirectQuery 的詳細資訊,請參閱下列文章: