WITH resultado_produtos AS (

    SELECT	
        r.mes,
        r.nome_empresa,
        r.categoria_item,
        SUM(r.custo) AS total_custo,
        SUM(r.total_bruto - desconto) AS total_venda
    FROM	(


        SELECT
            EXTRACT('MONTH' FROM mvt.data_movimento) AS mes,	
            se.nome AS nome_empresa,
            ci.denominacao AS categoria_item,
            SUM(ivc.quantidade) AS quantidade,
            SUM(
                ROUND((ivc.preco_original * ivc.quantidade), 2) + (
                CASE WHEN ROUND((ivc.preco_original * ivc.quantidade), 2) < ivc.total_item THEN ivc.total_item - ROUND((ivc.preco_original * ivc.quantidade), 2) ELSE 0 END
                )
            ) AS total_bruto,
            SUM(
                CASE WHEN ROUND((ivc.preco_original * ivc.quantidade), 2) > ivc.total_item THEN ROUND((ivc.preco_original * ivc.quantidade), 2) - ivc.total_item ELSE 0 END
            ) AS desconto,            
            SUM(ivc.acrescimo + ivc.acrescimo_automatico + ivc.acrescimo_rateado + ivc.acrescimo_ajuste_rateado + ivc.acrescimo_automatico_rateado) AS acrescimo,
            COALESCE(SUM(me.valor), 0) AS custo
        FROM	movimento_venda_terminal AS mvt
            INNER JOIN venda_cf AS vc ON (vc.id_movimento_venda_terminal = mvt.id_movimento_venda_terminal)
            INNER JOIN item_venda_cf AS ivc ON (ivc.id_venda_cf = vc.id_venda_cf)
            INNER JOIN movimento_estoque AS me ON (me.id_movimento_estoque = ivc.id_movimento_estoque)
            INNER JOIN item AS i ON (ivc.id_item = i.id_item)
            INNER JOIN categoria_item AS ci ON (ci.id_categoria_item = i.id_categoria_item)
            INNER JOIN sis_empresa AS se ON (se.id_empresa = mvt.id_empresa)
        WHERE	mvt.id_empresa IN (:IdEmpresaMultSlc)
        AND	EXTRACT('YEAR' FROM mvt.data_movimento) = :Ano
        AND	EXTRACT('YEAR' FROM vc.data_cupom) = :Ano
        AND	EXTRACT('YEAR' FROM ivc.data_venda) = :Ano
        AND	EXTRACT('MONTH' FROM mvt.data_movimento) IN (:MesMult)
        AND	EXTRACT('MONTH' FROM vc.data_cupom) IN (:MesMult)
        AND	EXTRACT('MONTH' FROM ivc.data_venda) IN (:MesMult)
        AND	(ivc.cancelado = 'N' AND vc.cancelada = 'N')
        AND	ivc.id_bico_combustivel IS NULL
        GROUP BY 1,2,3

        UNION ALL

        SELECT	
            EXTRACT('MONTH' FROM nfs.emissao) AS mes,	
            se.nome AS nome_empresa,
            ci.denominacao AS categoria_item,
            SUM(infs.quantidade) AS quantidade,
            SUM(infs.total_item + infs.desconto) AS total_bruto,
            SUM(infs.desconto) AS desconto,
            0.00 AS acrescimo,
            COALESCE(SUM(me.valor), 0) AS custo
        FROM	nota_fiscal_saida AS nfs
            INNER JOIN item_nfs AS infs ON (infs.id_nota_fiscal_saida = nfs.id_nota_fiscal_saida)
            INNER JOIN sis_referencia_registro AS rr ON (rr.id_chave_registro_a = infs.id_item_nfs AND rr.tipo_referencia = 'ref_1101_0411_movimento_estoque_nfs')
            INNER JOIN movimento_estoque AS me ON (me.id_movimento_estoque = rr.id_chave_registro_b)
            INNER JOIN item AS i ON (i.id_item = infs.id_item)
            INNER JOIN categoria_item AS ci ON (ci.id_categoria_item = i.id_categoria_item)
            INNER JOIN sis_empresa AS se ON (se.id_empresa = nfs.id_empresa)
        WHERE	nfs.id_empresa IN (:IdEmpresaMultSlc)
        AND EXTRACT('YEAR' FROM nfs.emissao) = :Ano
        AND EXTRACT('MONTH' FROM nfs.emissao) IN (:MesMult)
        AND	nfs.situacao = 1 

        AND	EXISTS(SELECT 1 FROM cfop WHERE tipo_movimento_estoque != 4 AND gera_titulo_financeiro = 'S' AND id_tipo_movimento_estoque = 7 AND id_cfop = infs.id_cfop)
        GROUP BY 1,2,3

        UNION ALL


        SELECT	
            EXTRACT('MONTH' FROM nfe.emissao) AS mes,	
            se.nome AS nome_empresa,
            ci.denominacao AS categoria_item,
            (SUM(infe.quantidade) * -1) AS quantidade,
            (SUM(infe.total_produto + infe.desconto) * -1) AS total_bruto,
            (SUM(infe.desconto) * -1) AS desconto,
            0.00 AS acrescimo,
            (SUM(me.valor) * -1) AS custo
        FROM	nota_fiscal_entrada AS nfe
            INNER JOIN item_nfe AS infe ON (infe.id_nota_fiscal_entrada = nfe.id_nota_fiscal_entrada)
            INNER JOIN movimento_estoque AS me ON (me.id_movimento_estoque = infe.id_movimento_estoque)
            INNER JOIN item AS i ON (i.id_item = infe.id_item)
            INNER JOIN categoria_item AS ci ON (i.id_categoria_item = ci.id_categoria_item)
            INNER JOIN sis_empresa AS se ON (se.id_empresa = nfe.id_empresa)
        WHERE	nfe.id_empresa IN (:IdEmpresaMultSlc)
        AND	EXTRACT('YEAR' FROM nfe.emissao) = :Ano
        AND	EXTRACT('MONTH' FROM nfe.emissao) IN (:MesMult)
        AND	(i.tipo_item = 0)
        AND	EXTRACT('YEAR' FROM me.data_movimento) = :Ano
        AND	EXTRACT('MONTH' FROM me.data_movimento) IN (:MesMult)
        AND	nfe.situacao = 1 
        AND	EXISTS(SELECT 1 FROM cfop WHERE tipo_movimento_estoque != 4 AND id_tipo_movimento_estoque = 3 AND id_cfop = infe.id_cfop)
        GROUP BY 1,2,3

    ) AS r
    GROUP BY r.nome_empresa,
            r.mes,
        r.categoria_item
    ORDER BY r.nome_empresa,
        r.categoria_item
)

SELECT  
    nome_empresa,
    categoria_item,
    SUM(CASE WHEN mes = 1 THEN total_venda ELSE 0 END) AS janeiro_venda,
    SUM(CASE WHEN mes = 1 THEN total_custo ELSE 0 END) AS janeiro_custo,
    SUM(CASE WHEN mes = 2 THEN total_venda ELSE 0 END) AS fevereiro_venda,
    SUM(CASE WHEN mes = 2 THEN total_custo ELSE 0 END) AS fevereiro_custo,
    SUM(CASE WHEN mes = 3 THEN total_venda ELSE 0 END) AS marco_venda,
    SUM(CASE WHEN mes = 3 THEN total_custo ELSE 0 END) AS marco_custo,
    SUM(CASE WHEN mes = 4 THEN total_venda ELSE 0 END) AS abril_venda,
    SUM(CASE WHEN mes = 4 THEN total_custo ELSE 0 END) AS abril_custo,
    SUM(CASE WHEN mes = 5 THEN total_venda ELSE 0 END) AS maio_venda,
    SUM(CASE WHEN mes = 5 THEN total_custo ELSE 0 END) AS maio_custo,
    SUM(CASE WHEN mes = 6 THEN total_venda ELSE 0 END) AS junho_venda,
    SUM(CASE WHEN mes = 6 THEN total_custo ELSE 0 END) AS junho_custo,
    SUM(CASE WHEN mes = 7 THEN total_venda ELSE 0 END) AS julho_venda,
    SUM(CASE WHEN mes = 7 THEN total_custo ELSE 0 END) AS julho_custo,
    SUM(CASE WHEN mes = 8 THEN total_venda ELSE 0 END) AS agosto_venda,
    SUM(CASE WHEN mes = 8 THEN total_custo ELSE 0 END) AS agosto_custo,
    SUM(CASE WHEN mes = 9 THEN total_venda ELSE 0 END) AS setembro_venda,
    SUM(CASE WHEN mes = 9 THEN total_custo ELSE 0 END) AS setembro_custo,
    SUM(CASE WHEN mes = 10 THEN total_venda ELSE 0 END) AS outubro_venda,
    SUM(CASE WHEN mes = 10 THEN total_custo ELSE 0 END) AS outubro_custo,
    SUM(CASE WHEN mes = 11 THEN total_venda ELSE 0 END) AS novembro_venda,
    SUM(CASE WHEN mes = 11 THEN total_custo ELSE 0 END) AS novembro_custo,
    SUM(CASE WHEN mes = 12 THEN total_venda ELSE 0 END) AS dezembro_venda,
    SUM(CASE WHEN mes = 12 THEN total_custo ELSE 0 END) AS dezembro_custo,
    SUM(total_venda) AS informacao_anual_venda,
    SUM(total_custo) AS informacao_anual_custo
FROM  resultado_produtos
GROUP BY 1,2