練習 - 使用聯結運算子合併資料表結果
在此練習中,您會了解如何使用 join
運算子。 記得 join
運算子透過比對每個資料表中指定資料行的值,來合併兩個資料表的資料列。
讓我們使用 join
運算子的結果來回答銷售相關問題。
使用 join
運算子
在我們的零售公司案例中,您的小組要求您列出銷售量最高的三個國家/地區。
當您開始檢查銷售事實資料表時,您會發現您需要的數字在銷售量資料行中,但資料表不包含任何國家/地區資料。 檢查其他資料表時,您會注意到 [客戶] 資料表的 RegionCountryName 資料行中提供國家/地區資料。 您也會注意到這兩個資料表都有 CustomerKey 資料行。
由於資料分散在兩個資料表上,因此您需要客戶資料和銷售資料,才能撰寫查詢提供要求的資訊。 若要撰寫查詢,您可以使用 join
運算子和 CustomerKey 資料行來比對這兩個表格中的資料列。
現在您可以開始撰寫查詢了。 使用內部join
來取得這兩個表格的所有相符資料列。 為了獲得最佳效能,請使用客戶維度資料表做為左側資料表,並將銷售事實資料表作為右側資料表。
在下列程序中,您會分階段建置查詢,讓您更了解使用 join
運算子的結果。
執行下列查詢,從客戶資料表和銷售事實資料表取得 10 個相符的任意資料列。
Customers | join kind=inner SalesFact on CustomerKey | take 10
查看結果產生的清單。 請注意,資料表包含客戶資料表中的資料行,後面接著來自銷售事實資料表的相符資料行。
執行下列查詢來摘要聯結的資料表,以取得具有最大銷售額的三個國家/地區。
Customers | join kind=inner SalesFact on CustomerKey | summarize TotalAmount = round(sum(SalesAmount)) by RegionCountryName | top 3 by TotalAmount
結果應該如下圖所示:
查看結果產生的清單。 請嘗試修改查詢,以一併顯示這些國家/地區的對應總成本和收益。
然後,您的小組會要求您依月份找出過去記錄年度營收最低的國家/地區。 若要取得此資料,您可以使用類似的查詢。 但這次,您會使用 startofmonth()
函式來協助將月份分組。 您也可以使用 arg_min()
彙總函數來尋找每個月營收最低的國家/地區。
執行下列查詢。
Customers | join kind=inner SalesFact on CustomerKey | summarize TotalAmount = round(sum(SalesAmount)) by Month = startofmonth(DateKey), RegionCountryName | summarize arg_min(TotalAmount, RegionCountryName) by Month | top 12 by Month desc
結果應該如下圖所示:
查看每個資料列。 請注意,第一個資料行以遞減順序顯示去年月份,後面接著顯示該月份銷售數位最低國家/地區的總銷售額資料行。
使用 rightouter join
種類
您的銷售小組想要知道依產品類別的總銷售額。 當您開始檢閱可用的資料時,您會發現需要產品資料表來取得產品類別清單,及銷售事實資料表以取得銷售資料。 您也瞭解您想要計算每個類別的銷售量,並列出所有產品類別。
分析要求之後,您可以選擇使用 rightouter join
,因為它會從右側資料表傳回所有銷售記錄,並以左側資料表中的相符資料產品類別進行擴充。 您可以使用產品資料表作為左側維度資料表、從銷售事實事實資料表比對資料,以及依產品類別將結果分組,以撰寫查詢。
執行下列查詢。
Products | join kind=rightouter SalesFact on ProductKey | summarize TotalSales = count() by ProductCategoryName | order by TotalSales desc
結果應該如下圖所示:
請注意,執行時間是 0.834 秒,但這次的時間可能會有所不同。 此查詢是取得此答案的一種方式,而且是未針對效能最佳化之查詢的良好範例。 稍後,您可以使用
lookup
運算子來比較此時間與對等查詢的執行階段,此運算子已針對這種類型的資料最佳化。
使用 rightanti join
種類
同樣地,您的銷售小組想要知道未在每個產品類別中銷售不佳的產品數目。 您可以使用 rightanti join
從產品資料表取得不符合銷售事實資料表中任何資料列的所有資料列,然後依產品類別將結果分組。
執行下列查詢。
SalesFact | join kind=rightanti Products on ProductKey | summarize Count = count() by ProductCategoryName | order by Count desc
結果應該如下圖所示:
查看每個資料列。 結果會顯示每個產品類別的未銷售產品數目。 請注意,rightanti
join
只會選取沒有銷售事實的產品,表示join
運算子傳回的產品沒有銷售量。