none
FORMATO DE CAMPO PARA CÁLCULO DE PORCENTAGEM

    Question

  • Prezados,

    Me ajude, estou precisando de um único formato de campo para cálculo de porcentagem, estou tendo problemas com os decimais, quando o número é inteiro ok tenho a solucão, abaixo minha query:

    declare

     

    @teste_percentual as table

    (

     

    Valor money,

     

    P numeric(3,2),

     

    P2 tinyint

     

    )

     

     

    ---Insert dos valores e percentuais

     

     

    INSERT INTO teste_percentual SELECT 1000.00, 0.10, 10

     

    INSERT INTO teste_percentual SELECT 1000.00, 0.20, 20

     

    INSERT INTO teste_percentual SELECT 1000.00, 0.05, 5

     

    INSERT INTO teste_percentual SELECT 1000.00, 1.00, 100

     

    INSERT INTO teste_percentual SELECT 4800.00, 6.52, 6

     

     

    -- consulta do cálculo

     

     

    SELECT

     

    Valor, P,P2,

     

    Ex1 = CAST(Valor * (1+P) AS MONEY),

     

    Ex2 = CAST(Valor + (Valor * P2 /100) AS MONEY)

     

    FROM

     

    teste_percentual

    Resultado do Ex1 quando usado números decimais está sendo calculado errado

    Valor P P2 Ex_1 Ex_2
    1000,00  0.10  10  1100,00  1.100,00
    3200,00  6.20  23040,00  3.392,00
    4800,00  6.52  36096,00  5.088,00

    Wednesday, August 11, 2010 2:22 AM

Answers

  • Wesley,

    Fiz algumas modificacoes no seu script, pelo que entendi o P1 e P2 são porcentagens (apesar do p2 ser um tinyint).

    declare @teste_percentual as table
    (
    Valor money,
    P numeric(3,2),
    P2 tinyint
    )
    
    ---Insert dos valores e percentuais
    INSERT INTO @teste_percentual SELECT 1000.00, 0.10, 10 
    INSERT INTO @teste_percentual SELECT 1000.00, 0.20, 20 
    INSERT INTO @teste_percentual SELECT 1000.00, 0.05, 5 
    INSERT INTO @teste_percentual SELECT 1000.00, 1.00, 100 
    INSERT INTO @teste_percentual SELECT 4800.00, 6.52, 6 
    
    -- consulta do cálculo
    SELECT Valor, P,P2,
    Ex1 = cast(valor+((Valor * P)/100) as money),
    Ex2 = Valor + ((Valor * P2) /100) 
    FROM @teste_percentual
    

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba
    Wednesday, August 11, 2010 11:48 AM
  • Adote como regra utilizar a variavel do tipo float quando voce necessita efetuar uma divisão com resultado fracionário.
    No exemplo abaixo primeiro convertemos o valor de P2 em float antes de utiliza-lo em uma divisão.
    Coloquei em negrito sublinhado as alterações necessários para o correto cálculo.

    Create Table #teste_percentual (
    Valor money,
    P1 numeric(3,2), 
    P2 smallint)
    ---Insert dos valores e percentuais
    INSERT INTO #teste_percentual SELECT 1000.00, 0.10, 10
    INSERT INTO #teste_percentual SELECT 1000.00, 0.20, 20
    INSERT INTO #teste_percentual SELECT 1000.00, 0.05, 5
    INSERT INTO #teste_percentual SELECT 1000.00, 1.00, 100
    INSERT INTO #teste_percentual SELECT 4800.00, 6.00, 600
    -- consulta do cálculo
    SELECT  Valor, 
    P1, 
    P2, 
    Ex1 = CAST(Valor * (1+P1) AS MONEY), 
    Ex2 = CAST(Valor + (Valor * (cast(P2 as float) /100.00)) AS MONEY) 
    FROM #teste_percentual
    drop table #teste_percentual

    Wednesday, August 11, 2010 2:01 PM
  • Marcelo,

    Show de bola, obrigado pela ajuda.

    • Marked as answer by Wesley Nunes Tuesday, June 14, 2011 1:40 AM
    Friday, August 13, 2010 8:54 PM

All replies

  • DECLARE @TABELA AS TABLE (VENDEDOR CHAR(50),TOTAL_VENDAS NUMERIC(10,2),FILIAL CHAR(50),PERC NUMERIC(10,2))
    INSERT INTO @TABELA VALUES ('VENDEDOR01','1350.73','SUA EMPRESA','1.25')
    INSERT INTO @TABELA VALUES ('VENDEDOR02','1587.32','SUA EMPRESA','1.25' )
    INSERT INTO @TABELA VALUES ('VENDEDOR03','1453.63','SUA EMPRESA','1.25')
    INSERT INTO @TABELA VALUES ('VENDEDOR04','2350.80','SUA EMPRESA','1.25')
    INSERT INTO @TABELA VALUES ('VENDEDOR05','1560.55','SUA EMPRESA','1.25')
      SELECT 
         VENDEDOR,
         TOTAL_VENDAS,
         FILIAL,
         PERC,
         CONVERT(NUMERIC(10,2),SUM(TOTAL_VENDAS*PERC)) AS COMISSAO
        FROM @TABELA
        GROUP BY 
        VENDEDOR,
         TOTAL_VENDAS,
         FILIAL,
         PERC

    SEGUE UM EXEMPLO  VERIFICA SE TE ATENDE

    Wednesday, August 11, 2010 11:25 AM
  • Wesley,

    Fiz algumas modificacoes no seu script, pelo que entendi o P1 e P2 são porcentagens (apesar do p2 ser um tinyint).

    declare @teste_percentual as table
    (
    Valor money,
    P numeric(3,2),
    P2 tinyint
    )
    
    ---Insert dos valores e percentuais
    INSERT INTO @teste_percentual SELECT 1000.00, 0.10, 10 
    INSERT INTO @teste_percentual SELECT 1000.00, 0.20, 20 
    INSERT INTO @teste_percentual SELECT 1000.00, 0.05, 5 
    INSERT INTO @teste_percentual SELECT 1000.00, 1.00, 100 
    INSERT INTO @teste_percentual SELECT 4800.00, 6.52, 6 
    
    -- consulta do cálculo
    SELECT Valor, P,P2,
    Ex1 = cast(valor+((Valor * P)/100) as money),
    Ex2 = Valor + ((Valor * P2) /100) 
    FROM @teste_percentual
    

    att.
    Marcelo Fernandes


    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba
    Wednesday, August 11, 2010 11:48 AM
  • Adote como regra utilizar a variavel do tipo float quando voce necessita efetuar uma divisão com resultado fracionário.
    No exemplo abaixo primeiro convertemos o valor de P2 em float antes de utiliza-lo em uma divisão.
    Coloquei em negrito sublinhado as alterações necessários para o correto cálculo.

    Create Table #teste_percentual (
    Valor money,
    P1 numeric(3,2), 
    P2 smallint)
    ---Insert dos valores e percentuais
    INSERT INTO #teste_percentual SELECT 1000.00, 0.10, 10
    INSERT INTO #teste_percentual SELECT 1000.00, 0.20, 20
    INSERT INTO #teste_percentual SELECT 1000.00, 0.05, 5
    INSERT INTO #teste_percentual SELECT 1000.00, 1.00, 100
    INSERT INTO #teste_percentual SELECT 4800.00, 6.00, 600
    -- consulta do cálculo
    SELECT  Valor, 
    P1, 
    P2, 
    Ex1 = CAST(Valor * (1+P1) AS MONEY), 
    Ex2 = CAST(Valor + (Valor * (cast(P2 as float) /100.00)) AS MONEY) 
    FROM #teste_percentual
    drop table #teste_percentual

    Wednesday, August 11, 2010 2:01 PM
  • Marcelo,

    Show de bola, obrigado pela ajuda.

    • Marked as answer by Wesley Nunes Tuesday, June 14, 2011 1:40 AM
    Friday, August 13, 2010 8:54 PM
  • H4CKERHT,

    FIZ UMA PEQUENA ALTERAÇÃO NO SELECT E ME ATENDEU, OBRIGADO PELA AJUDA ABAIXO ALTERAÇÃO:

    DECLARE @TABELA AS TABLE (VENDEDOR CHAR(50),TOTAL_VENDAS NUMERIC(10,2),FILIAL CHAR(50),PERC NUMERIC(10,2))
    INSERT INTO @TABELA VALUES ('VENDEDOR01','1350.73','SUA EMPRESA','1.25')
    INSERT INTO @TABELA VALUES ('VENDEDOR02','1587.32','SUA EMPRESA','1.25' )
    INSERT INTO @TABELA VALUES ('VENDEDOR03','1453.63','SUA EMPRESA','1.25')
    INSERT INTO @TABELA VALUES ('VENDEDOR04','2350.80','SUA EMPRESA','1.25')
    INSERT INTO @TABELA VALUES ('VENDEDOR05','1560.55','SUA EMPRESA','1.25')

    SELECT

     

    VENDEDOR,

     

    TOTAL_VENDAS,

     

    FILIAL,

     

    PERC,

     

    CONVERT(NUMERIC(10,2),SUM(TOTAL_VENDAS*PERC/100+TOTAL_VENDAS)) AS COMISSAO

     

    FROM COMISSAO

     

    GROUP BY

     

    VENDEDOR,

     

    TOTAL_VENDAS,

     

    FILIAL,

     

    PERC

    Tuesday, August 17, 2010 12:17 AM