none
Erro de conversão varchar to float RRS feed

  • Pergunta

  • Boa tarde pessoas,

    Seguinte, estou na batalha com um relatório para um cliente e preciso criar uma query onde obtenha a porcentagem do desconto em relação ao valor bruto de uma parcela. Consegui, em partes porquê, ao executar a query, ela me traz o que preciso, porém, aparece também uma mensagem de erro informando: "Error converting data type varchar to float." e, lógico, quando transporto essa mesma query para o gerador de relatórios do meu ERP não funciona. Segue a dita cuja e, se alguém poderia me dar uma luz no fim do túnel, agradeceria.

    SELECT fmf.CodigoUnidade,
           fmf.AnoSemestre,
           fmf.CodigoCurso,
           fmf.Matricula,
           fp.Parcela,
           ftp.CodigoTipoParcela,
           ftp.DescricaoTipoParcela,
           fmf.Percentual,
           ROUND( SUM(((cast (replace (fmf.Percentual,',','.')AS FLOAT)) ) *100 /(cast (replace (fp.ValorParcela,',','.')AS FLOAT)) ),2) as Porcentagem,
           fp.ParcelaBaixada,
           fp.ValorParcela,
           afca.NomeAluno
    FROM Fin_MatriculaFinanceira AS fmf
    INNER JOIN Fin_TipoParcela AS ftp ON fmf.CodigoUnidade = ftp.CodigoUnidade
    AND fmf.TipoParcela = ftp.CodigoTipoParcela
    INNER JOIN Fin_Parcelas AS fp ON fmf.CodigoUnidade = fp.CodigoUnidade
    AND fmf.AnoSemestre = fp.AnoSemestre
    AND fmf.CodigoCurso = fp.CodigoCurso
    AND fmf.Matricula = fp.Matricula
    INNER JOIN Aca_FichaCadastralAluno AS afca ON afca.CodigoUnidade = fmf.CodigoUnidade
    AND afca.Matricula = fmf.Matricula
    WHERE ftp.Tipo IN ('Desconto', 'Bolsa')
    AND ftp.TipoCalculo = 'Valor Mensal da Parcelas Mensal do Aluno'
    AND fmf.CodigoUnidade = '1'
    AND fmf.AnoSemestre = 'Ano2019'
    --AND fp.Parcela = 'Out/2019'
    GROUP BY fmf.CodigoUnidade,
             fmf.AnoSemestre,
             fmf.CodigoCurso,
             fmf.Matricula,
             fp.Parcela,
             ftp.CodigoTipoParcela,
             ftp.DescricaoTipoParcela,
             fmf.Percentual,
             fp.ParcelaBaixada,
             fp.ValorParcela,
             afca.NomeAluno
    


    terça-feira, 22 de outubro de 2019 20:47

Respostas

  • Boa tarde,

    Pelo que entendi o tipo de dados das colunas fmf.Percentual e fp.ValorParcela é varchar ou semelhante.

    Se for isso mesmo e se os valores gravados nessas colunas tiver também o caractere separador de milhares (no caso o '.'), será necessário executar um Replace adicional para remover esse caractere.

    Espero que ajude 


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Glauber_CNF quarta-feira, 23 de outubro de 2019 13:40
    terça-feira, 22 de outubro de 2019 21:04

Todas as Respostas

  • Boa tarde,

    Pelo que entendi o tipo de dados das colunas fmf.Percentual e fp.ValorParcela é varchar ou semelhante.

    Se for isso mesmo e se os valores gravados nessas colunas tiver também o caractere separador de milhares (no caso o '.'), será necessário executar um Replace adicional para remover esse caractere.

    Espero que ajude 


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta Glauber_CNF quarta-feira, 23 de outubro de 2019 13:40
    terça-feira, 22 de outubro de 2019 21:04
  • Glauber, você pode postar amostra do conteúdo das duas colunas?

    -- código #1 v2
    SELECT top (5) Percentual
      from Fin_MatriculaFinanceira
    where isnumeric (replace (Percentual, ',', '.')) = 0; SELECT top (5) ValorParcela from Fin_Parcelas
      where isnumeric (replace (ValorTabela, ',', '.')) = 0;
     

    ---

    Me parece que as colunas fmf.Percentual e fp.ValorParcela não podem fazer parte da lista de colunas e da cláusula GROUP BY se o objetivo é totalizar algo.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz quarta-feira, 23 de outubro de 2019 13:02
    terça-feira, 22 de outubro de 2019 21:30
  • Ok, deixa eu tentar explicar, apesar da coluna se chamar Percentual, ela pode receber tanto um valor de desconto em valores absolutos quanto porcentagem, tudo depende de que parâmetro selecionar nas configurações iniciais do ERP. Uma fez configurado, todos os descontos gravados na tabela Fin_MatriculaFinanceira seguem o que foi selecionado, no caso passado, cliente escolheu trabalhar com valores absolutos.

    Já a coluna ValorParcela da tabela Fin_parcelas, guarda o valor bruto da parcela, sem desconto nenhum. 

    quarta-feira, 23 de outubro de 2019 05:29
  • Ok, deixa eu tentar explicar, apesar da coluna se chamar Percentual, ela pode receber tanto um valor de desconto em valores absolutos quanto porcentagem, tudo depende de que parâmetro selecionar nas configurações iniciais do ERP. Uma fez configurado, todos os descontos gravados na tabela Fin_MatriculaFinanceira seguem o que foi selecionado, no caso passado, cliente escolheu trabalhar com valores absolutos.

    Já a coluna ValorParcela da tabela Fin_parcelas, guarda o valor bruto da parcela, sem desconto nenhum. 

    Glauber, qual é o objetivo da linha
        ROUND( SUM(((cast (replace (fmf.Percentual,',','.')AS FLOAT)) ) *100 /(cast (replace (fp.ValorParcela,',','.')AS FLOAT)) ),2) as Porcentagem,

    Isto é, o que espera que essa fórmula retorne?

    ---

    Não há como totalizar algo com GROUP BY se a coluna a ser totalizada faz parte da lista de colunas e da cláusula GROUP BY.

    -- código #2
    SELECT coluna_1, coluna_2, sum (coluna_3 * 100 / coluna_4) as soma, coluna_4, coluna_3
      from tabela
      group by coluna_1, coluna_2, coluna_3, coluna_4;
      

    O código que você publicou faz algo semelhante ao código #2: ao mesmo tempo em que faz somatória utilizando coluna_3 e coluna_4 também lista o conteúdo delas e também constam na cláusula GROUP BY.

    No caso do código #2, para efetuar a somatória seria necessário algo como

    -- código #3
    SELECT coluna_1, coluna_2, sum (coluna_3 * 100 / coluna_4) as soma
      from tabela
      group by coluna_1, coluna_2;

    Observe que coluna_3 e coluna_4 foram retiradas da lista de colunas e da cláusula GROUP BY.

     
    Ou então, caso seja necessário exibir a somatória ao lado do valor, algo como

    -- código #4
    SELECT coluna_1, coluna_2, 
           sum (coluna_3 * 100 / coluna_4) over (partition by ___ order by ___) as soma, 
           coluna_4, coluna_3
      from tabela;
    Observe que sem a cláusula GROUP BY.  

    ---

    Com relação ao erro "Error converting data type varchar to float.", é necessário avaliar o conteúdo das colunas Percentual e ValorParcela para encontrar a causa.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz quarta-feira, 23 de outubro de 2019 09:46
    quarta-feira, 23 de outubro de 2019 09:38
  • A função da linha 
    ROUND( SUM(((cast (replace (fmf.Percentual,',','.')AS FLOAT)) ) *100 /(cast (replace (fp.ValorParcela,',','.')AS FLOAT)) ),2) as Porcentagem,
    é para saber qual a porcentagem entre o campo fmf.percentual e fp.valorparcela.
    quarta-feira, 23 de outubro de 2019 12:26
  • Glauber, segue uma sugestão para teste considerando que o tipo de dados das colunas é varchar ou semelhante:

           ROUND
               ( cast( replace( replace(fmf.Percentual, '.', ''), ',', '.' ) AS FLOAT ) * 100 /
                 cast( replace( replace(fp.ValorParcela, '.', ''), ',', '.') AS FLOAT ), 2) as Porcentagem

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quarta-feira, 23 de outubro de 2019 12:28
  • A função da linha 
    ROUND( SUM(((cast (replace (fmf.Percentual,',','.')AS FLOAT)) ) *100 /(cast (replace (fp.ValorParcela,',','.')AS FLOAT)) ),2) as Porcentagem,
    é para saber qual a porcentagem entre o campo fmf.percentual e fp.valorparcela.

    E qual o motivo de ter utilizado a função SUM()?

    Se não necessita de totalização por coluna, essa função não é necessária e nem a cláusula GROUP BY.

    -- código #5
    SELECT coluna_1, coluna_2, 
           (coluna_3 * 100 / coluna_4) as porcentagem, 
           coluna_4, coluna_3
      from tabela;

    ---

    E lembre-se: para saber qual foi o motivo do erro "Error converting data type varchar to float." é necessário o resultado da execução do código #1.


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Editado José Diz quarta-feira, 23 de outubro de 2019 13:08
    quarta-feira, 23 de outubro de 2019 12:37