WITH qtde_total_geral AS (
SELECT
to_char(nf.data_venda, 'YYYY') AS ano,
SUM(inf.quantidade) AS quantidade_total_geral
FROM
notas_fiscais nf
INNER JOIN itens_notas_fiscais inf ON nf.numero = inf.numero
WHERE
to_char(nf.data_venda, 'YYYY') = '2016'
GROUP BY
to_char(nf.data_venda, 'YYYY')
), qtde_total AS (
SELECT
inf.codigo_do_produto,
to_char(nf.data_venda, 'YYYY') AS ano,
SUM(inf.quantidade) AS quantidade
FROM
notas_fiscais nf
INNER JOIN itens_notas_fiscais inf ON nf.numero = inf.numero
WHERE
to_char(nf.data_venda, 'YYYY') = '2016'
GROUP BY
inf.codigo_do_produto,
to_char(nf.data_venda, 'YYYY')
), produtos AS (
SELECT
codigo_do_produto,
nome_do_produto,
tamanho
FROM
tabela_de_produtos
)
SELECT
p.tamanho,
qt.ano,
SUM(qt.quantidade) AS quantidade_total,
round((SUM(qt.quantidade) / qtg.quantidade_total_geral) * 100, 2) AS percentual_participacao
FROM
qtde_total qt
INNER JOIN qtde_total_geral qtg ON qt.ano = qtg.ano
INNER JOIN produtos p ON qt.codigo_do_produto = p.codigo_do_produto
GROUP BY
p.tamanho,
qt.ano,
qtg.quantidade_total_geral
ORDER BY
4 DESC;