1
resposta

CONSIDERADO QUANTIDADE COMO UNIDADE E NÃO VOLUME

Considerando que a quantidade é uma unidade de produto e que não necessariamente é 1 litro segue passos: 1 - CRIAÇÃO DE UM VIEW TRANSFORMANDO OS VOLUMES DE STRING PARA DECIMAL.

    SELECT 
        `tabela_de_produtos`.`CODIGO_DO_PRODUTO` AS `CODIGO_DO_PRODUTO`,
        (CASE
            WHEN (SUBSTRING_INDEX(`tabela_de_produtos`.`TAMANHO`, ' ', 1) = 700) THEN CAST(0.70 AS DECIMAL (2 , 2 ))
            WHEN (SUBSTRING_INDEX(`tabela_de_produtos`.`TAMANHO`, ' ', 1) = 350) THEN CAST(0.35 AS DECIMAL (2 , 2 ))
            WHEN (SUBSTRING_INDEX(`tabela_de_produtos`.`TAMANHO`, ' ', 1) = 470) THEN CAST(0.47 AS DECIMAL (2 , 2 ))
            WHEN (SUBSTRING_INDEX(`tabela_de_produtos`.`TAMANHO`, ' ', 1) = '1,5') THEN CAST(1.5 AS DECIMAL (2 , 1 ))
            ELSE CAST(SUBSTRING_INDEX(`tabela_de_produtos`.`TAMANHO`, ' ', 1)
                AS DECIMAL (1 , 1 ))
        END) AS `TAMANHO`
    FROM
        `tabela_de_produtos`

2 - CRIAÇÃO DOS VOLUMES EM L, POR SABOR E TOTAL 2.1 - POR SABOR

(SELECT 
        SABOR, SUM(UNIDADE) AS VOLUME_L, ANO
    FROM
        (SELECT 
        SABOR,
            (SUM(QUANTIDADE) * D.TAMANHO) AS UNIDADE,
            YEAR(DATA_VENDA) AS ANO,
            D.TAMANHO
    FROM
        itens_notas_fiscais A
    INNER JOIN tabela_de_produtos b ON A.CODIGO_DO_PRODUTO = B.CODIGO_DO_PRODUTO
    INNER JOIN notas_fiscais C ON A.NUMERO = C.NUMERO
    INNER JOIN VW_TAMANHO D ON A.CODIGO_DO_PRODUTO = D.CODIGO_DO_PRODUTO
    WHERE
        YEAR(DATA_VENDA) = 2016
    GROUP BY SABOR , D.TAMANHO , YEAR(DATA_VENDA) ) AS TB_2
    GROUP BY SABOR , ANO) AS VENDA_SABOR''

2.2 - VOLUME TOTAL

 (SELECT 
        ANO, SUM(TOTAl) AS TOTAL_l
    FROM
        (SELECT 
        YEAR(DATA_VENDA) AS ANO,
            (SUM(QUANTIDADE) * B.TAMANHO) AS TOTAL,
            TAMANHO
    FROM
        itens_notas_fiscais A
    INNER JOIN notas_fiscais C ON A.NUMERO = C.NUMERO
    INNER JOIN vw_tamanho B ON B.CODIGO_DO_PRODUTO = A.CODIGO_DO_PRODUTO
    WHERE
        YEAR(DATA_VENDA) = 2016
    GROUP BY YEAR(DATA_VENDA) , B.TAMANHO) AS tb
    GROUP BY ANO) AS VENDA_TOTAL

AGORA TUDO JUNTO COM O INNER JOIN

SELECT 
    SABOR,
    VENDA_SABOR.ANO,
    VOLUME_L,
    CONCAT(ROUND(((VOLUME_L / TOTAL_l) * 100), 1),
            '%') AS PERCENTAGEM
FROM
    (SELECT 
        ANO, SUM(TOTAl) AS TOTAL_l
    FROM
        (SELECT 
        YEAR(DATA_VENDA) AS ANO,
            (SUM(QUANTIDADE) * B.TAMANHO) AS TOTAL,
            TAMANHO
    FROM
        itens_notas_fiscais A
    INNER JOIN notas_fiscais C ON A.NUMERO = C.NUMERO
    INNER JOIN vw_tamanho B ON B.CODIGO_DO_PRODUTO = A.CODIGO_DO_PRODUTO
    WHERE
        YEAR(DATA_VENDA) = 2016
    GROUP BY YEAR(DATA_VENDA) , B.TAMANHO) AS tb
    GROUP BY ANO) AS VENDA_TOTAL
        INNER JOIN
    (SELECT 
        SABOR, SUM(UNIDADE) AS VOLUME_L, ANO
    FROM
        (SELECT 
        SABOR,
            (SUM(QUANTIDADE) * D.TAMANHO) AS UNIDADE,
            YEAR(DATA_VENDA) AS ANO,
            D.TAMANHO
    FROM
        itens_notas_fiscais A
    INNER JOIN tabela_de_produtos b ON A.CODIGO_DO_PRODUTO = B.CODIGO_DO_PRODUTO
    INNER JOIN notas_fiscais C ON A.NUMERO = C.NUMERO
    INNER JOIN VW_TAMANHO D ON A.CODIGO_DO_PRODUTO = D.CODIGO_DO_PRODUTO
    WHERE
        YEAR(DATA_VENDA) = 2016
    GROUP BY SABOR , D.TAMANHO , YEAR(DATA_VENDA) ) AS TB_2
    GROUP BY SABOR , ANO) AS VENDA_SABOR ON VENDA_SABOR.ANO = VENDA_TOTAL.ANO
GROUP BY SABOR , ANO
ORDER BY VOLUME_L DESC;
1 resposta

Oi, Vinicius! Tudo bem?

Peço desculpas pela demora em retornar.

Testei os códigos que você compartilhou e adorei o resultado! Muito bacana a sua ideia, parabéns pela dedicação e por todo o cuidado em desenvolver os scripts SQL e trazê-los ao fórum.

Continue sempre com este empenho nos estudos que você vai longe, Vini. Em caso de dúvidas, fico à disposição.

Um forte abraço!