练习 - 使用 union 运算符合并表结果

已完成

在本练习中,你使用 union 运算符来合并从不同国家/地区收集的销售事实数据。

使用 union 运算符

你的销售团队要求你创建一个表,其中包含以下每个国家/地区(澳大利亚、英国和美国)的 10 条任意销售结果。

你将使用 let 语句创建三个表格表达式,每个表达式包含来自 SalesFact 表中特定国家/地区的 10 条记录,用于表示来自三个国家/地区的销售数据。 可将它们视为三个单独的表。

检查这些表,可以看到它们具有相同的列。 唯一的区别是 RegionCountryName 列中的数据。 你将使用 union 运算符将英国和美国的销售事实数据表合并到澳大利亚的销售事实数据表。

  1. 运行以下查询。

    运行查询

    let AustraliaSales = SalesFact // Sales facts from Australia
        | lookup Customers on CustomerKey
        | where RegionCountryName == 'Australia'
        | take 10;
    let UnitedKingdomSales = SalesFact // Sales facts from United Kingdom
        | lookup Customers on CustomerKey
        | where RegionCountryName == 'United Kingdom'
        | take 10;
    let UnitedStatesSales = SalesFact // Sales facts from United States
        | lookup Customers on CustomerKey
        | where RegionCountryName == 'United States'
        | take 10;
    AustraliaSales
    | union UnitedKingdomSales, UnitedStatesSales
    

    结果应如下图所示:

    Screenshot of the union operator with tables that have the same columns, query, and results.

  2. 请注意,可从这三个表中获取所有行。 尝试修改查询以添加法国的模拟数据,并将其与其他国家/地区的数据合并。

以下部分将使用 let 语句创建临时表,这些表使用场景所需的列模拟数据。

对具有不同列的表使用 union 运算符

次月,你的销售团队再次要求你创建这三个国家/地区的销售数据。 这次检查表时,你会发现它们具有不同的列。 使用 union 运算符的好处是,可以合并具有不同列的表。 对于此查询,可使用不需要管道输入的 union 运算符的替代语法。

  1. 运行以下查询。

    运行查询

    let AustraliaSales = SalesFact
        | lookup Customers on CustomerKey
        | where RegionCountryName == 'Australia'
        | take 10
        | project SalesAmount, TotalCost, DateKey, RegionCountryName, CityName;
    let UnitedKingdomSales = SalesFact
        | lookup Customers on CustomerKey
        | where RegionCountryName == 'United Kingdom'
        | take 10
        | project SalesAmount, TotalCost, DateKey, RegionCountryName, Occupation;
    let UnitedStatesSales = SalesFact
        | lookup Customers on CustomerKey
        | where RegionCountryName == 'United States'
        | take 10
        | project SalesAmount, TotalCost, DateKey, RegionCountryName, StateProvinceName;
    union AustraliaSales, UnitedKingdomSales, UnitedStatesSales
    

    结果应如下图所示:

    Screenshot of the union operator, with tables that have different columns, query, and results.

  2. 请注意,可获取这三个表中的所有行以及任何表中出现的所有列。 输入行未定义的单元格设置为 null。 尝试修改查询以添加更多列,看看其值在结果中的填充方式。

对具有不同列的表使用 union 运算符,仅返回所有表中出现的列

随后的一个月,你的销售团队再次要求你创建这三个国家/地区的销售数据,但这一次他们只需要这三个表共有的列。 之前你已了解到,使用 union 运算符可返回任何表中出现的所有列。 这是 union 运算符的默认行为,称为外部联合,但为了清楚起见,最好始终显式指定联合类型。

要仅返回所有表中出现的列,可通过指定 kind=inner 参数对相同的模拟数据使用内部联合:

  1. 运行以下查询。

    运行查询

    let AustraliaSales = SalesFact
        | lookup Customers on CustomerKey
        | where RegionCountryName == 'Australia'
        | take 10
        | project SalesAmount, TotalCost, DateKey, RegionCountryName, CityName;
    let UnitedKingdomSales = SalesFact
        | lookup Customers on CustomerKey
        | where RegionCountryName == 'United Kingdom'
        | take 10
        | project SalesAmount, TotalCost, DateKey, RegionCountryName, Occupation;
    let UnitedStatesSales = SalesFact
        | lookup Customers on CustomerKey
        | where RegionCountryName == 'United States'
        | take 10
        | project SalesAmount, TotalCost, DateKey, RegionCountryName, StateProvinceName;
    union kind=inner AustraliaSales, UnitedKingdomSales, UnitedStatesSales
    

    结果应如下图所示:

    Screenshot of the union operator, returning common columns from tables that have different columns, query, and results.

    请注意,可获取这三个表中的所有行,但只能获取这三个表中出现的共有列。

  2. 现在,尝试修改查询,通过扩展每个表的同名列来添加更多共有列。 然后,看看其值在结果中的填充方式。