練習 - 使用聯結運算子合併資料表結果

已完成

在此練習中,您會了解如何使用 join 運算子。 記得 join 運算子透過比對每個資料表中指定資料行的值,來合併兩個資料表的資料列。

讓我們使用 join 運算子的結果來回答銷售相關問題。

使用 join 運算子

在我們的零售公司案例中,您的小組要求您列出銷售量最高的三個國家/地區。

當您開始檢查銷售事實資料表時,您會發現您需要的數字在銷售量資料行中,但資料表不包含任何國家/地區資料。 檢查其他資料表時,您會注意到 [客戶] 資料表的 RegionCountryName 資料行中提供國家/地區資料。 您也會注意到這兩個資料表都有 CustomerKey 資料行。

由於資料分散在兩個資料表上,因此您需要客戶資料和銷售資料,才能撰寫查詢提供要求的資訊。 若要撰寫查詢,您可以使用 join 運算子和 CustomerKey 資料行來比對這兩個表格中的資料列。

現在您可以開始撰寫查詢了。 使用內部join來取得這兩個表格的所有相符資料列。 為了獲得最佳效能,請使用客戶維度資料表做為左側資料表,並將銷售事實資料表作為右側資料表。

在下列程序中,您會分階段建置查詢,讓您更了解使用 join 運算子的結果。

  1. 執行下列查詢,從客戶資料表和銷售事實資料表取得 10 個相符的任意資料列。

    執行查詢

    Customers
    | join kind=inner SalesFact on CustomerKey
    | take 10
    

    查看結果產生的清單。 請注意,資料表包含客戶資料表中的資料行,後面接著來自銷售事實資料表的相符資料行。

  2. 執行下列查詢來摘要聯結的資料表,以取得具有最大銷售額的三個國家/地區。

    執行查詢

    Customers
    | join kind=inner SalesFact on CustomerKey
    | summarize TotalAmount = round(sum(SalesAmount)) by RegionCountryName
    | top 3 by TotalAmount
    

    結果應該如下圖所示:

    聯結運算子查詢的螢幕擷取畫面,顯示具有最大銷售額的三個國家/地區。

  3. 查看結果產生的清單。 請嘗試修改查詢,以一併顯示這些國家/地區的對應總成本和收益。

然後,您的小組會要求您依月份找出過去記錄年度營收最低的國家/地區。 若要取得此資料,您可以使用類似的查詢。 但這次,您會使用 startofmonth() 函式來協助將月份分組。 您也可以使用 arg_min() 彙總函數來尋找每個月營收最低的國家/地區。

  1. 執行下列查詢。

    執行查詢

    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
    

    結果應該如下圖所示:

    聯結運算子查詢的螢幕擷取畫面,顯示顯示具有最低銷售額的三個國家/地區。

  2. 查看每個資料列。 請注意,第一個資料行以遞減順序顯示去年月份,後面接著顯示該月份銷售數位最低國家/地區的總銷售額資料行。

使用 rightouter join 種類

您的銷售小組想要知道依產品類別的總銷售額。 當您開始檢閱可用的資料時,您會發現需要產品資料表來取得產品類別清單,及銷售事實資料表以取得銷售資料。 您也瞭解您想要計算每個類別的銷售量,並列出所有產品類別。

分析要求之後,您可以選擇使用 rightouter join,因為它會從右側資料表傳回所有銷售記錄,並以左側資料表中的相符資料產品類別進行擴充。 您可以使用產品資料表作為左側維度資料表、從銷售事實事實資料表比對資料,以及依產品類別將結果分組,以撰寫查詢。

  1. 執行下列查詢。

    執行查詢

    Products
    | join kind=rightouter SalesFact on ProductKey
    | summarize TotalSales = count() by ProductCategoryName
    | order by TotalSales desc
    

    結果應該如下圖所示:

    聯結運算子查詢的螢幕擷取畫面,顯示各項產品的總銷售額。

  2. 請注意,執行時間是 0.834 秒,但這次的時間可能會有所不同。 此查詢是取得此答案的一種方式,而且是未針對效能最佳化之查詢的良好範例。 稍後,您可以使用 lookup 運算子來比較此時間與對等查詢的執行階段,此運算子已針對這種類型的資料最佳化。

使用 rightanti join 種類

同樣地,您的銷售小組想要知道未在每個產品類別中銷售不佳的產品數目。 您可以使用 rightanti join產品資料表取得不符合銷售事實資料表中任何資料列的所有資料列,然後依產品類別將結果分組。

  1. 執行下列查詢。

    執行查詢

    SalesFact
    | join kind=rightanti Products on ProductKey
    | summarize Count = count() by ProductCategoryName
    | order by Count desc
    

    結果應該如下圖所示:

    聯結運算子查詢的螢幕擷取畫面,顯示顯示各產品類別中銷售不佳的產品數目。

    查看每個資料列。 結果會顯示每個產品類別的未銷售產品數目。 請注意,rightanti join 只會選取沒有銷售事實的產品,表示 join 運算子傳回的產品沒有銷售量。