Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bruno M Duarte

Calculo de porcentagem de venda.

Recommended Posts

Bom dia pessoal ?

 

E o seguinte.

Eu estou implementando um relatório de faturamento onde eu preciso listar as informações de cada representante, e eu preciso fazer um calculo de porcentagem de venda de cada representante. O calculo é esse: ( valor_produto / vl_total_somatoria_valor_produto ) * 100.

Eu sei que o calculo é esse, mais só que não sei como expressar esse calculo na minha consulta SQL!!!

 

O código SQL.

SELECT id_repres AS cd_repres, CONCAT(id_repres,'-',nm_repres) AS repres, 
( SELECT IFNULL( COUNT( num_nf ), '0' )                                                                FROM lino.nota_tipo_a_d_n_v_vw_t WHERE id_repres = cd_repres ) AS nr_nf, 
( SELECT SUM( IF( tipo_fat != '3', vl_tot_n_fiscal, ( vl_total_mercad * 100 / aliq_tf) + vl_ipi))      FROM lino.nota_tipo_a_d_n_v_vw_t WHERE id_repres = cd_repres ) AS vl_cont, 
( SELECT SUM( IF( tipo_fat != '3', vl_total_mercad, vl_total_mercad * 100 / aliq_tf ) )                FROM lino.nota_tipo_a_d_n_v_vw_t WHERE id_repres = cd_repres ) AS vl_prod, 
( SELECT SUM( vl_ipi)                                                                                  FROM lino.nota_tipo_a_d_n_v_vw_t WHERE id_repres = cd_repres ) AS vl_ipi, 
( SELECT SUM( vl_icms)                                                                                 FROM lino.nota_tipo_a_d_n_v_vw_t WHERE id_repres = cd_repres ) AS vl_icms, 
( SELECT SUM( IF( tipo_fat != '3', vl_comissao * aliq_com / 100, vl_comissao * aliq_com / aliq_tf ))   FROM lino.nota_tipo_a_d_n_v_vw_t WHERE id_repres = cd_repres ) AS vl_comis, 
( SELECT SUM( ( ( vl_comissao / vl_total_mercad ) * 100 ) )                                            FROM lino.nota_tipo_a_d_n_v_vw_t WHERE id_repres = cd_repres ) AS vl_porc_comis

FROM lino.nota_tipo_a_d_n_v_vw_t 

WHERE id_repres >= '001' AND id_repres <= '107' 
AND cod_divisao IN('01' ,'02' ,'03' ,'04' ,'05') 
AND dt_fat >= '2014-06-01' AND dt_fat <= '2014-07-18' 

GROUP BY cd_repres;

Me retorna algo assim:

+-----------------+-----------------------------------------+----------+--------------+--------------+-----------+------------+--------------+------------------------+

| CD_REPRES | REPRES | NR_NF | VL_CONT | VL_PROD | VL_IPI | VL_ICMS | VL_COMIS | VL_PORC_COMIS |

+-----------------+-----------------------------------------+----------+--------------+--------------+-----------+------------+--------------+------------------------+

| 76 | 76-CYBELAR COMERCIO LTDA | 5 | 271352.25 | 269400.00 | 1952.25 | 4919.67 | 0.00 | 0.00 |

+-----------------+-----------------------------------------+----------+--------------+--------------+-----------+------------+--------------+------------------------+

| 82 | 82-MARA COMERCIO LTDA | 3 | 149374.50 | 148140.00 | 1234.50 | 1814.72 | 0.00 | 0.00 |

+-----------------+-----------------------------------------+----------+--------------+--------------+-----------+------------+--------------+------------------------+

 

A minha dificuldade é fazer a somatória do valor do produto( VL_PROD ) e só depois eu irei aplicar a formula da porcentagem.

 

Espero que tenha sido claro. E desde já agradeço a quem me ajuda!

Vlw!!!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente com CASE

SELECT id_repres AS cd_repres, CONCAT(id_repres,'-',nm_repres) AS repres,
...
SUM( CASE WHEN TIPO_FAT != '3' THEN VL_TOTAL_MERCAD, VL_TOTAL_MERCAD * 100 / ALIQ_TF ELSE 0 END)    VL_PROD,
...
FROM lino.nota_tipo_a_d_n_v_vw_t

WHERE id_repres >= '001' AND id_repres <= '107'
AND cod_divisao IN('01' ,'02' ,'03' ,'04' ,'05')
AND dt_fat >= '2014-06-01' AND dt_fat <= '2014-07-18'

GROUP BY cd_repres;

Compartilhar este post


Link para o post
Compartilhar em outros sites

O código ficou bem bagunçado aqui, da maneira como está formatado.

 

Sugiro o seguinte "layout" genérico:

 


select
    c1,                                         -- atributo da unidade
    ...,                                        -- 
    cn,                                         -- último atributo da unidade
    sum(métrica)                  participacao  -- participação total da unidade
    sum(métrica) / total * 100    partic_pct    -- percentual
from
    t
join
    (select 
        c1, 
        ..., 
        cm,
        sum(métrica)  total
     from 
        t 
     group 
        by 1, ..., m
    ) as soma_total               -- (note que cm != cn e m < n)
        using (c1, ..., cm)
group by
    1, ..., n;
Claro, nem sempre é recomendável fazer isso com subqueries, mas fica mais fácil entender o exemplo abstrato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.