Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Utilizando CTEs para a resolução da atividade;

Gostaria de compartilhar a resolução da atividade utilizando CTEs ( Common Table Expressions) ou Expressão de tabela comum. Como tenho dois SELECTs, um que calcula a venda por tamanho e o outro a venda total, ambos serão executados como uma tabela temporária que existe apenas durante a execução da consulta e isso me permitiu a utilização de CTEs. Você pode encontrar sobre CTEs na própria documentação do Mysql e também no artigo da Alura (link abaixo).

Documentação Mysql: https://dev.mysql.com/doc/refman/8.4/en/with.html

Artigo da Alura: https://www.alura.com.br/artigos/cte-o-que-e-para-que-serve-sql

Explicação da estrutura do código. A cláusula WITH define duas CTEs. Cada CTE foi definida pelo nome. A primeira é a venda_tamanho e a segunda é a venda_total, separadas por virgula. O último select representa a consulta principal responsável por mostrar o resultado esperado (TAMANHO, ANO_VENDA, QUANTIDADE_VENDIDA e PARTICIPACAO ) e também por fazer a junção entre as duas CTEs utilizando o INNER JOIN, tendo a coluna ANO_VENDA como referência entre as duas CTEs.

WITH venda_tamanho AS (
    SELECT 
        P.TAMANHO AS TAMANHO,
        YEAR(N.DATA_VENDA) AS ANO_VENDA,
        SUM(I.QUANTIDADE) AS QUANTIDADE_VENDIDA
    FROM
        tabela_de_produtos P
    INNER JOIN 
        itens_notas_fiscais I ON P.CODIGO_DO_PRODUTO = I.CODIGO_DO_PRODUTO 
    INNER JOIN
        notas_fiscais N ON I.NUMERO = N.NUMERO 
    WHERE 
        YEAR(N.DATA_VENDA) = 2016
    GROUP BY
        P.TAMANHO,
        YEAR(N.DATA_VENDA)
),
venda_total AS (
    SELECT 
        YEAR(DATA_VENDA) AS ANO_VENDA,
        SUM(I.QUANTIDADE) AS QUANTIDADE_TOTAL
    FROM 
        notas_fiscais N
    INNER JOIN 
        itens_notas_fiscais I ON N.NUMERO = I.NUMERO
    WHERE 
        YEAR(N.DATA_VENDA) = 2016
    GROUP BY
        YEAR(N.DATA_VENDA)
)
SELECT 
    VS.TAMANHO,
    VS.ANO_VENDA,
    VS.QUANTIDADE_VENDIDA,
    ROUND((VS.QUANTIDADE_VENDIDA / VT.QUANTIDADE_TOTAL) *100, 2) AS PARTICIPACAO
FROM 
    venda_tamanho VS
INNER JOIN
    venda_total VT ON VS.ANO_VENDA = VT.ANO_VENDA
ORDER BY
    VS.QUANTIDADE_VENDIDA DESC;
1 resposta
solução!

Olá, Charles, tudo bem?

Que bom que você compartilhou sua resolução utilizando CTEs (Common Table Expressions)! A utilização de CTEs realmente facilita a leitura e manutenção do código, especialmente quando temos múltiplos SELECTs que precisam ser combinados.

Seu código está bem estruturado e está correto para a atividade proposta. Ele cria duas CTEs: venda_tamanho e venda_total, e depois faz a junção entre elas para calcular a participação das vendas por tamanho.

Charles, obrigada por compartilhar sua solução no fórum, ela poderá ajudar outros alunos!

Qualquer dúvida, compartilhe no fórum.

Abraços e bons estudos!