Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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!!!
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.
tente com CASE
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_tWHERE 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;