Exercício – Combinar os resultados da tabela usando o operador join

Concluído

Neste exercício, você aprenderá a usar o operador join. Lembre-se de que o operador join mescla as linhas das duas tabelas correspondendo valores das colunas especificadas de cada tabela.

Vamos usar os resultados do operador join para responder perguntas sobre vendas.

Use o operador join

No cenário da empresa de varejo, sua equipe pede que você liste os três países/regiões com o maior número de vendas.

Ao começar a inspecionar a tabela SalesFact, observe que os números necessários estão disponíveis na coluna SalesAmount, mas a tabela não contém dados de país/região. Examinando as outras tabelas, você percebe que os dados de país/região estão disponíveis na coluna RegionCountryName na tabela Clientes. Você também observa que ambas as tabelas têm uma coluna CustomerKey.

Como os dados estão distribuídos em duas tabelas, você precisa dos dados do cliente e dos dados de vendas para gravar uma consulta que forneça as informações solicitadas. Para escrever a consulta, você usa o operador join e a coluna CustomerKey para fazer a correspondência das linhas de ambas as tabelas.

Agora você já pode escrever a consulta. Use um interno join para obter todas as linhas correspondentes de ambas as tabelas. Para obter melhor desempenho, use a tabela de dimensão de clientes como a tabela esquerda e a tabela de fatos de vendas como a tabela à direita.

No procedimento a seguir, você cria a consulta em estágios para entender melhor o resultado do uso do operador join.

  1. Execute a consulta a seguir para obter dez linhas arbitrárias correspondentes da tabela Customers e da tabela SalesFact.

    Executar a consulta

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

    Confira a lista resultante. Observe que a tabela contém colunas da tabela Customers, seguidas de colunas correspondentes da tabela SalesFact.

  2. Execute a consulta a seguir para resumir as tabelas unidas a fim de obter os três países/regiões que têm mais vendas.

    Executar a consulta

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

    Os resultados serão parecidos com a seguinte imagem:

    Captura de tela da consulta do operador join que mostra os três principais países/regiões por vendas.

  3. Confira a lista resultante. Tente modificar a consulta para mostrar também o custo total e o lucro correspondentes para esses países/essas regiões.

Em seguida, sua equipe pede que você identifique os países/as regiões com as receitas mais baixas do último ano registrado, por mês. Para obter esses dados, use uma consulta semelhante. Mas, desta vez, você usa a função startofmonth() para facilitar o agrupamento por mês. Você também usa a função de agregação arg_min() para encontrar os países/as regiões com as menores receitas em cada mês.

  1. Execute a consulta a seguir.

    Executar a consulta

    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
    

    Os resultados serão parecidos com a seguinte imagem:

    Captura de tela da consulta do operador join, que mostra os países/as regiões com as menores receitas.

  2. Examine cada linha. Observe que a primeira coluna mostra os meses do último ano em ordem decrescente, seguido das colunas que mostram o total de vendas para o país/a região com os menores números de vendas do mês.

Use o tipo de join externo direito

Sua equipe de vendas deseja saber o total de vendas por categoria de produto. Ao começar a examinar os dados disponíveis, você percebe que precisa da tabela Produtos para obter a lista de categorias de produtos e a tabela SalesFact para obter os dados de vendas. Você também percebe que deseja contar as vendas de cada categoria e listar todas as categorias de produtos.

Após analisar a solicitação, você deve optar por usar a rightouter join, porque ela retorna todos os registros de vendas da tabela à direita, enriquecidos com dados correspondentes da categoria de produto da tabela à esquerda. Você escreve sua consulta usando a tabela Produtos como a tabela de dimensão esquerda, correspondendo dados da tabela de fatos SalesFact e agrupando o resultado por categoria de produto.

  1. Execute a consulta a seguir.

    Executar a consulta

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

    Os resultados serão parecidos com a seguinte imagem:

    Captura de tela da consulta do operador join, mostrando o total de vendas por produto.

  2. Observe que o tempo de execução é de 0,834 segundo, embora esse tempo possa variar entre as execuções. Essa consulta é uma forma de obter essa resposta e é um bom exemplo de uma consulta que não é otimizada para desempenho. Posteriormente, você pode comparar esse tempo com o tempo de execução de uma consulta equivalente usando o operador lookup, que é otimizado para esse tipo de dados.

Usar o tipo rightanti join

Da mesma forma, sua equipe de vendas deseja saber o número de produtos que não são vendidos em cada categoria de produto. Você pode usar um rightanti join para obter todas as linhas da tabela Produtos que não correspondem a nenhuma linha na tabela SalesFacts e então agrupar os resultados por categoria de produto.

  1. Execute a consulta a seguir.

    Executar a consulta

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

    Os resultados serão parecidos com a seguinte imagem:

    Captura de tela da consulta do operador join mostrando o número de produtos que não são vendidos em cada categoria de produto.

    Examine cada linha. Os resultados mostram o número de produtos não vendidos por categoria de produto. Observe que o rightanti join seleciona apenas os produtos que não têm fatos de vendas, indicando que não houve vendas para os produtos retornados pelo operador join.