使用關係的多表資料來源的分析方式
使用具有多個相關資料表的資料來源時,會影響分析在 Tableau 中的運作方式。因為多個相關表具有獨立的領域,且保有其原生的詳細程度,因此當您將欄位拖曳至檢視中時:
- 資料會在其自然的詳細資訊層級查詢。
- 僅查詢與視覺效果相關的資料。
- 表之間的關係會影響查詢的結果。建置視覺效果的流程,可能會因為欄位表在資料模型中彼此關聯的方式,或其是否未直接關聯,而有所不同。
有關資料來源增強功能的概觀以及使用關係的介紹,請觀看這段 5 分鐘的影片。
附註:本影片和本主題中顯示的編輯關係介面與當前版本略有不同,但功能相同。
可以在善加運用關係和以下 Tableau 部落格文章中瞭解關係如何工作的詳情:
另請參閱「動作分析」(連結在新視窗開啟)中有關關係的影片播客,例如 Tableau 為何發明關係?(連結在新視窗開啟)按一下內容庫(連結在新視窗開啟)中的「影片播客」以查看更多資訊。
在 Tableau 版本 2024.2 及之後版本中,Tableau 資料模型支援透過多重要素關係進行多事實分析與共用維度。有關詳情,請參閱關於多事實關係資料模型(連結在新視窗開啟)、何時使用多事實關係模型(連結在新視窗開啟)與建置多事實關係資料模型(連結在新視窗開啟)。
備註:您仍然可以在 Tableau 中建立單一表資料來源。您可以使用聯結、聯集、自訂 SQL 等機制的組合來建置邏輯資料表。Tableau 中的單一表分析行為並未變更。對包含維度和度量混合的單一邏輯資料表進行分析的運作方式,與 Tableau 2020.2 預發行版本的運作方式相同。
分析注意事項
驗證關係
有多個選項可用來驗證資料模型以進行分析。當您為資料來源建立模型時,建議您前往工作表,選取該資料來源,然後建置視覺效果以探索記錄計數、預期的資料、不相符的值、null 或重複的度量值。請嘗試使用不同表中的欄位,以確定一切行為都如您所預期。
要查找的內容:
- 您在資料模型中的關係是否使用符合其表的正確欄位?
- 新增多個相符欄位配對,是否會使關係更精確?
- 將不同的維度和度量拖曳至檢視中,會產生什麼結果?
- 您是否看到預期的列數?
- 如果您將任何效能選項設定變更為非預設的設定,您在視覺效果中看到的值是否符合預期?如果不是,您可能需要檢查設定,或重設為預設值。
驗證關係與資料模型的選項:
- 每個表在該表的詳細層級都會包含其記錄的計數,以名為 TableName(Count) 的欄位表示。若要查看表的計數,請將「計數」欄位拖曳至檢視中。若要查看所有表的計數,請在「資料」窗格中,選取每個表的「計數」欄位,然後按一下「顯示」中的「文字表」。
- 按一下「資料」窗格中的「檢視資料」,以查看每個表的列數和資料。此外,在開始建立關係之前,在分析之前或期間檢視資料來源中的資料,可能有助於您瞭解每個表的範圍。有關詳情,請參閱檢視基礎資料。
- 將維度拖曳到列,以查看狀態列中的「列數」。若要查看不符合的值,請按一下「分析」功能表,然後選取「表配置」>「顯示空列」或「顯示空欄」。您也可以將不同度量拖曳到檢視中,例如視覺效果中呈現之其中一個表的 <YourTable>(Count)。這樣可確保您從該表看見維度的所有值。
提示:若要查看針對關係所產生的查詢,可以使用 Tableau Desktop 中的效能記錄程式。
- 按一下「說明」功能表,然後選取「設定和效能」>「啟動效能記錄」。
- 將欄位拖曳到檢視中以建立視覺效果。
- 按一下「說明」功能表,然後選取「設定和效能」>「停止效能記錄」。「效能記錄」工作簿將自動開啟。
- 在「效能摘要」儀表板窗格中的「依時間排序的事件」下,按一下「執行查詢」列,並檢視下方查詢。
另一個更進階的選項,是使用 GitHub 上的 Tableau 記錄檢視器(連結在新視窗開啟)。您可以使用 end-protocol.query
來篩選特定關鍵字。有關詳情,請先參閱 GitHub 中的 Tableau 記錄檢視器 Wiki 頁面(連結在新視窗開啟)。
僅維度視覺效果
將多表資料來源與相關資料表搭配使用時:如果建置僅維度的視覺效果,Tableau 會使用內部聯結,而且您無法看到完整的不相符網域。
若要查看維度值的部分組合,您可以:
- 使用「顯示空列/欄」以查看所有可能的列。按一下「分析」功能表,然後選取「表配置」>「顯示空列」或「顯示空欄」。請注意,此設定也會觸發「日期」與「數位資料桶」欄位的密集化,這可能是不必要的。
- 將度量新增到檢視中,例如,視覺效果中呈現之其中一個表的 <YourTable>(Count)。這樣可確保您看見來自該表之維度的所有值。
有關詳細資訊,亦請參閱維度的不相符值行為可能會令您感到意外與多資料表分析疑難排解。
何時使用 LOD 計算與運算式
由於 Tableau 可以瞭解輸入表的詳細層級 (LOD),所以您不需要使用 LOD 計算來移除聯結所導致的不必要重複。
您可能仍希望使用 LOD calcs 進行下列動作:
- 處理來源表中不當的重複資料。
- 計算多層彙總(例如,總和的平均值)
- 進行同類群組分析(例如,計算每個客戶的第一個訂單日期)
如果 LOD calc 的維度包含單一表中的欄位,則該 LOD 計算將顯示在「資料」窗格中的所屬表中。
多資料表分析範例
以下範例組將示範如何跨多個相關表查詢資料。這個多表資料來源包含不同電影角色的演員演出簡短清單。
「演出」表中的列表示演員在特定電影中扮演了特定角色。在此資料集中,演員的演出可能是零或更多。
您可以在以下 Tableau 部落格文章中瞭解關係如何工作的詳情:
範例 1:聯結資料與相關資料的單一問題分析
當您在 2020.2 之前的 Tableau 版本中連線至資料時,您的資料來源可能只包含單一表,或包含相互聯結或聯集為單一非標準化表的多個表。從 Tableau 2020.2 版本開始,Tableau 即可識別並保留多表資料來源的標準化資料,其中表資料會保持獨立,而且每個表都會保有原生的詳細程度。以下範例說明了單一表與多表資料來源之間的分析差異。
此範例顯示三個電影資料表:「演出」、「演員」和「電影」。
這些表可以聯結在一起,在「演員」上將「演出」表和「演員」表聯結在一起 =「演員」,在「電影」上將「演出」表和「電影」表聯結在一起 =「電影」。如果聯結是完全外部聯結,就不會遺失任何列,最終輸出的外觀會如下所示。請注意,聯結子句中使用的欄位會顯示兩次。
以這種方式合併到單一表中的資料稱為非標準化或扁平。
這個聯結的資料是扁平資料。每列都會包含一位演員在一部電影中演出的一個角色(因此 John Rhys-Davies 在《魔戒三部曲:王者再臨》中有兩列,因為他扮演了兩個角色);因此,資料的粒度為電影中的角色層級。多個列中的相關資訊會重複。《魔戒三部曲:王者再臨》的首映日期出現兩次,因為資料集中含有這部電影的兩個角色。John Rhys-Davies 的身高列出五次,因為他的演員身份有 5 個不重複的角色/電影組合。
因此,這個扁平資料具有一些需要注意的特徵。例如,如果您希望依照演員電影的平均總收入來繪製演員的身高,您可能會假設我們可以將「身高」帶入「欄」,並將「總收入」帶入「列」,然後取得「總收入」的平均值。但是,如果您這麼做,預設檢視看起來會不太對勁。在這裡,John Rhys-Davies 身高會是 925 公分,也就是超過 30 英尺!
這是因為預設彙總為 SUM。資料中有 5 列是他的,因此我們會得出他真實身高 185 公分的 5 倍。您可以變更「身高」上的彙總(例如平均值或最小值)來解決此問題。這樣會有效地僅傳回一列的值(因為它們都相同)。
變更彙總時,身高會更為逼真。但是,現在您必須注意平均總收入。請記住,Tableau 會將 John Rhys-Davies 身高的所有五列都列入考量。當您考慮他演出之電影的平均總收入時,就不應該是五列的平均值,而是三部電影的平均值。您並不想要因為他在《魔戒三部曲:王者再臨》中扮演了兩個角色而計算兩次《魔戒三部曲:王者再臨》的總收入。但這就是所發生的狀況嗎?
快速計算一下,《魔戒》系列電影的平均值應該是 (869 + 923 + 1119)/3,或是 $970.3。但是,散佈圖中的值是 $990.6。目前的平均值來自五個列 (869 + 923 + 923 + 1119 + 1119)/5。
這個問題不像透過變更彙總來解決身高問題一樣容易。您需要使用詳細層級 (LOD) 運算式,來修改從預設的「演出」向上到「電影」層級中,Tableau 查看的詳細層級為何。在我們來看,您可以將 LOD 總收入計算建立為 {FIXED [Movie] : MIN([Gross (USD millions)])},然後取得新的 LOD 總收入欄位的平均值。
LOD 運算式可以解讀為「對每部電影傳回其最低總收入」。這樣就能夠消除重複問題,因為即使檢視是以電影和演員組成,還是會一律傳回每部電影的總收入。
現在數字就正確了。John Rhys-Davies 身高 185 公分,而且他在這個資料集的電影平均總收入是 970.3。您可能需要先瞭解資料為何會重複,以及 Tableau 如何彙總資料以顯示資料,才能確保傳回正確的值。
多個表中的標準化資料
在邏輯表之間建立關係可能看似與建立聯結類似,但與其將資料展平到單一表中,Tableau 會透過所有可能會產生的重複內容來持續注意表之間的關係。系統會在適當的詳細資料層級從每個表帶出資訊,並與其他資料建立關係。
在「資料來源」頁面上,您不會看到扁平表的「完整」網格檢視,因為它不存在。Tableau 會將所有三個表保持原樣,而且只會建立關係,也就是視檢視需要將所需的資料組合在一起。
若要建立相同的散佈圖,請將「身高」和「總收入」拖到檢視中,並將「總收入」設為平均值。這樣就可以了!Tableau 會查看每個表的資料與其他相關表之資料的關係,並推斷應如何顯示身高(依照演員)以及如何計算平均總收入(依照電影)。
範例 2:單一表中的維度
如果視覺效果中的維度來自單一表,Tableau 就只會查詢一個表並顯示整個網域的結果。您可以新增度量,但仍然會看到整個網域。
例如,使用上方介紹的「電影演出」資料來源,將「演員」欄位新增到視覺效果時,會產生以下視覺效果:
由於視覺效果中的唯一維度是來自「演員」表,因此 Tableau 只會針對「演員」表執行查詢。出現在「演員」表中的所有演員都會顯示在視覺效果中,無論是否有任何演出。
將「演出演員」欄位作為度量引進檢視中,然後套用 COUNT 彙總,就會建立依照演員顯示的演出次數檢視。請注意,Sigourney Weaver 沒有任何演出,但檢視中還是會有她的名字。
範例 3:來自多個表的維度
如果檢視中的維度來自多個表,Tableau 就會尋找與所有維度相關的表,並顯示來自該表的網域。因此,您在範例 1 中看到的某些維度值會有所變更。
例如,將「電影」表中的欄位拖到視覺效果中會變更查詢。由於「電影」和「演員」表是因為「演出」表而相關,因此查詢只會傳回「演出」表中存在的「演員/電影」配對。
由於 Sigourney Weaver 在此資料集中沒有任何演出(因此與資料集中的任何電影均不相關),「演員/電影」配對的視覺效果就不會顯示她的:
範例 4:無法依照維度拆分的度量
如果度量無法依照維度拆分,Tableau 就會在該維度間複製度量。
下一個視覺效果會依照電影顯示總收入金額。由於這兩個欄位都來自「電影」表,因此 Tableau 只會查詢「電影」表。
「電影」表包括每部電影已彙總的總收入,如以下視覺效果所示(建立此資料集時無法取得《復仇者聯盟:無限之戰》的總收入,因此顯示為零)。
如果您將「演員」新增至此視覺效果,Tableau 就會知道不能依照演員細分電影總收入,因為資料模型中並未提供這種更精細的資訊。相反地,Tableau 會顯示每部電影的電影總收入,而且會在演員之間重複顯示。
範例 5:與度量並非以階層方式相關的維度
將「電影」維度從前一個視覺效果中移除後,會查詢每位演員的電影總收入總和。所得的結果是演員演出過之每部電影的彙總電影總收入。
在此案例中,維度、演員和「電影總收入」度量之間並無階層關係,而且多位演員可能是在同一部電影中演出。例如,Benedict Cumberbatch 和 Chris Hemsworth 都在《奇異博士》中演出。在此案例中,Tableau 會將《奇異博士》的電影總收入包括在這兩位演員的總數中。
由於相同的影片總收入值包含在多位演員的總計中,因此 Tableau 無法直接計算這些值的總和。
但是,顯示此視覺效果的總數時,請注意:Tableau 會正確計算電影總收入,且不會包括重複的電影。
多資料表分析疑難排解
多表的相關表可能會有下列情況。下表說明了已知的情況,以及如何對分析進行疑難排解的高階說明。
分析情況 | 說明 | |
---|---|---|
僅維度視覺效果的內部聯結 | 在您將多個維度新增至同一個檢視時,可能無法立即看見所有的預期值。或者,您可能會注意到,從不同的表對視覺效果新增維度時,會導致某些值從視覺效果中消失。 Tableau 所使用的查詢,會保留資料中實際存在的值的組合。這表示您會看見由表的內部聯結所產生的列,這些表為視覺效果提供維度。 若要查看維度值的部分組合,您可以開啟「顯示空列/欄」,以查看所有可能的列;或者,您可以從檢視中所呈現的其中一個表來新增度量(例如 <MyTable>(Count)),以確保能看見該表中的所有維度值。 | |
計算中的常量 | 在多表資料來源中,常量值的行為就像是來自其具有單一列的表。如果您彙總一個常量值,其行為就會像是在單一列上彙總。Sum(10) 會永遠等於 10。Avg(10) 也會永遠等於 10。Count(10) 會永遠等於 1。 為能確保向後相容性,單一邏輯資料表資料來源中的常量值,其行為將會像是為表中的每個值複製的常量值。 列層級計算中的常量,不會變更計算的列詳細層級。[Sales] + 10 計算的行為會像是與 [Sales] 欄位來自同一個表。 | |
強制外部聯結 | Tableau 會確保所有度量值都呈現於視覺效果中(以及資料中實際出現的所有維度值組合),所以如果要確保在資料中看見所有可能的值(包括「不相符的空值」),您可以藉由從工作表的每個表中將度量帶入視圖之中來實現。 | |
我沒有看見跨表計算所預期的度量值 | 計算的域是其輸入的內部聯結。如果沒有相符的值來自度量計算的所有輸入,它們將不會包含於度量計算之中。 在建立列層級計算之前,請考慮使用 LOD 計算將度量值移動至相同的物件。 | |
在不同邏輯資料表的欄位之間切換的計算,會得出非預期的結果 | 如果您有一個在列層級欄位之間切換的計算,使用 Case 語句(若為語句)或諸如「IFNULL」的函數,您可能會看到非預期的結果,因為此計算是針對每一列來運算,其中列是計算輸入之間的內部聯結。 比較好的方法是在彙總值之間切換,而不是試圖在列層級計算之中切換。這也能在單一表情況中產生較好的效能。 此外,這只是跨表計算的一項問題,所以也可以使用 LOD 計算將所有欄位帶入相同的表中。 請勿執行此操作: SUM(
IF [Parameter] == "Foo" THEN [Field 1] ELSE [Field 2] END
)
請執行此操作: IF [Parameter] == "Foo" THEN SUM([Field 1]) ELSE SUM([Field 2]) END | |
非預期的不相符空值 | 您可能會看到與非預期的 Null 維度值相關聯的度量值。這可能表示資料來源中的關係設定不正確。此外,也可能表示包含度量的表中實際上有不相符的值,而維度表中沒有對應的列。 在過去,如果選取錯誤的聯結類型,此資料就可能會遺失。但在使用關係時,這些不相符的值會被保留。如果您不想要看到不相符的值,可以使用篩選條件來排除。 | |
彙總值不正確 | 您使用的是關係或是聯結?若使用關係,在預設情況下可以正確運算彙總。若使用聯結,則您可能需要編寫 LOD 計算以重複值。 您對關係的「效能選項」設定是否不正確?請嘗試將「效能選項」重設為預設值,並查看是否能產生正確的彙總。 | |
維度會複製度量值,而不是對其進行分區。 維度篩選條件並不會子集度量。 | 檢查用於定義關係的欄位是否正確。 | |
Tableau 正在產生太多的查詢,或具有很多左聯結的查詢 | 檢查記錄或效能記錄,以查看產生了多少查詢,以及使用了多少左聯結。藉由新的資料建模功能,Tableau 可以產生具有左聯結的查詢及/或其他查詢,以確保不相符的度量值永遠會包含在視覺效果中。如果您不需要查看不相符的值,可以使用篩選條件從視覺效果中移除不相符 (NULL) 的值。這會導致較少的查詢。 如果您知道資料中沒有任何不相符的值,您可以在「效能選項」中,將每個關係的「參考完整性」設定設為「所有值相符」。這也會導致較少的查詢。 您還可以降低視覺效果的複雜性,以減少所產生的查詢數量。移除度量並隱藏篩選條件控制項,是簡化多表相關資料查詢的關鍵方法。 | |
查詢包含許多子查詢 | 檢查記錄或效能記錄,以查看 Tableau 產生的查詢的複雜性。 Tableau 會在必要時自動產生子查詢以重複資料,以產生正確的彙總。這類似於由 LOD 計算所產生的查詢。 如果您知道資料中的邏輯資料表之間的關係具有「多對一」或「一對一」基數,則您可以在關係「效能選項」中設定這項基數資訊。這可以讓 Tableau 消除不必要的子查詢,因為它會知道不會發生重複。 | |
我過去是使用聯結來篩選資料 | 在 2020.2 版本中,Tableau 會努力復原不相符的值。在某些情況下,這表示它將會使用左聯結,而您可能已經指定了一個內部聯結,來有意地篩選資料。 如果您將此聯結所帶入的不相符值篩選出來,Tableau 能夠將查詢最佳化為內部聯結。 根據您的特定情況,可能可以將此內部聯結建模為邏輯資料表內的實體聯結。如果使用包含度量的表來篩選維度表,這種方法尤其有用,因為它不會導入額外的度量複製。 |