none
ajuda com query formatar money RRS feed

  • Pergunta

  • alguem poderia me ajudar rapidinho ,to com um problema ao formatar money

    minha query é essa ela funciona só que o valor total no caso o " SUM(CAST(produtos.avista AS MONEY)) / 100 AS total "
    ta me retornando assim 122,0000  por exemplo gostaria que alem dele formatar para 122,00 ele verificasse quando fosse 1.220,00 e colocasse o ponto.
    os valores no banco ta sendo armazenado em nvarchar assim  120,00 .
    alguem pode me ajudar?

    SELECT     SUM(CAST(produtos.avista AS MONEY)) / 100 AS total, produtos.id, produtos.id_empresa, produtos.id_subcategoria, produtos.Nome, produtos.avista,
                          CONVERT(nvarchar(150), produtos.fotoprincipal) AS fotoprincipal, carrinho.IP, carrinho.codigoproduto, carrinho.cores AS corescolhida,
                          carrinho.tamanhos AS tamanhoescolhido, carrinho.sabores AS saborescolhido, empresa.email_pagseguro, COUNT(produtos.id) AS quantidade
    FROM         produtos INNER JOIN
                          carrinho ON carrinho.codigoproduto = produtos.id INNER JOIN
                          empresa ON empresa.id = produtos.id_empresa
    GROUP BY produtos.id, produtos.id_empresa, produtos.id_subcategoria, produtos.Nome, produtos.avista, CONVERT(nvarchar(150), produtos.fotoprincipal),
                          carrinho.IP, carrinho.codigoproduto, carrinho.cores, carrinho.tamanhos, carrinho.sabores, empresa.email_pagseguro
    ORDER BY quantidade DESC

     

     

    sexta-feira, 26 de agosto de 2011 18:49

Respostas

  • Boa tarde Jeferson,

    Segue um exemplo:

    select REPLACE(CAST(CAST(1555005.3333 as money)/100 as numeric(10,2)),'.',',') as total

    No seu caso ficaria mais ou menos assim:

    SELECT     REPLACE(CAST(SUM(CAST(produtos.avista AS MONEY)) / 100 AS NUMERIC(10,2)),'.',','), produtos.id, produtos.id_empresa, produtos.id_subcategoria, produtos.Nome, produtos.avista,
                          CONVERT(nvarchar(150), produtos.fotoprincipal) AS fotoprincipal, carrinho.IP, carrinho.codigoproduto, carrinho.cores AS corescolhida,
                          carrinho.tamanhos AS tamanhoescolhido, carrinho.sabores AS saborescolhido, empresa.email_pagseguro, COUNT(produtos.id) AS quantidade
    FROM         produtos INNER JOIN
                          carrinho ON carrinho.codigoproduto = produtos.id INNER JOIN
                          empresa ON empresa.id = produtos.id_empresa
    GROUP BY produtos.id, produtos.id_empresa, produtos.id_subcategoria, produtos.Nome, produtos.avista, CONVERT(nvarchar(150), produtos.fotoprincipal),
                          carrinho.IP, carrinho.codigoproduto, carrinho.cores, carrinho.tamanhos, carrinho.sabores, empresa.email_pagseguro
    ORDER BY quantidade DESC

    Espero ter ajudado, se for o caso, marque como útil e como resposta.

    Até mais.


    Rafael Godoi Sabadin
    http://www.linkedin.com/in/rafaelgodoisabadin
    Classifique as respostas. O seu feedback é essencial.
    sexta-feira, 26 de agosto de 2011 19:40
  • Entendi, então como o Marcelo citou, vocë terá que desenvolver uma função ou algo do tipo para fazer este tratamento. Poderá usar a logica que você postou (SUBSTRING(CAST(REPLACE(valorcontrato, '.', ',') AS VARCHAR), 1, 1) + '.' + SUBSTRING(CAST(REPLACE(valorcontrato, '.', ',') AS VARCHAR), 2, 100) AS valorcontrato FROM (SELECT SUM(CAST(valorcontrato AS MONEY)) / 100) conseguir o resultado que precisa.

    Espero ter ajudado, se for o caso, marque como útil e como resposta.

    Até mais.


    Rafael Godoi Sabadin
    http://www.linkedin.com/in/rafaelgodoisabadin
    Classifique as respostas. O seu feedback é essencial.
    sábado, 27 de agosto de 2011 14:42
  • Segue um exemplo de como tratar isso:

    declare @avista nvarchar(10)
    set @avista = '1.230,00'

    select REPLACE(REPLACE(@avista,'.',''),',','.')

    select REPLACE(CAST(SUM(CAST(REPLACE(REPLACE(@avista,'.',''),',','.') AS MONEY)) / 100 AS NUMERIC(10,2)),'.',',') AS total

    Espero ter ajudado, se for o caso, marque como útil e como resposta.


    Rafael Godoi Sabadin
    http://www.linkedin.com/in/rafaelgodoisabadin
    Classifique as respostas. O seu feedback é essencial.
    sábado, 27 de agosto de 2011 15:46

Todas as Respostas

  • Jefferson

    Até é possível fazer isto no SQL, mas vc vai ter que criar uma função e tal.. e quem vai pagar a conta será a performance.

    A melhor solução é a sua aplicação fazer isto.... la será mais simples e com menor custo.


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    sexta-feira, 26 de agosto de 2011 19:34
  • Boa tarde Jeferson,

    Segue um exemplo:

    select REPLACE(CAST(CAST(1555005.3333 as money)/100 as numeric(10,2)),'.',',') as total

    No seu caso ficaria mais ou menos assim:

    SELECT     REPLACE(CAST(SUM(CAST(produtos.avista AS MONEY)) / 100 AS NUMERIC(10,2)),'.',','), produtos.id, produtos.id_empresa, produtos.id_subcategoria, produtos.Nome, produtos.avista,
                          CONVERT(nvarchar(150), produtos.fotoprincipal) AS fotoprincipal, carrinho.IP, carrinho.codigoproduto, carrinho.cores AS corescolhida,
                          carrinho.tamanhos AS tamanhoescolhido, carrinho.sabores AS saborescolhido, empresa.email_pagseguro, COUNT(produtos.id) AS quantidade
    FROM         produtos INNER JOIN
                          carrinho ON carrinho.codigoproduto = produtos.id INNER JOIN
                          empresa ON empresa.id = produtos.id_empresa
    GROUP BY produtos.id, produtos.id_empresa, produtos.id_subcategoria, produtos.Nome, produtos.avista, CONVERT(nvarchar(150), produtos.fotoprincipal),
                          carrinho.IP, carrinho.codigoproduto, carrinho.cores, carrinho.tamanhos, carrinho.sabores, empresa.email_pagseguro
    ORDER BY quantidade DESC

    Espero ter ajudado, se for o caso, marque como útil e como resposta.

    Até mais.


    Rafael Godoi Sabadin
    http://www.linkedin.com/in/rafaelgodoisabadin
    Classifique as respostas. O seu feedback é essencial.
    sexta-feira, 26 de agosto de 2011 19:40
  • bom rafael o código esta 80% do jeito que eu queria agora os resultados estão trazendo assim 1440,00 como faço para trazer 1.440,00 ?

    só falta isso *-*

    sexta-feira, 26 de agosto de 2011 19:48
  • certa vez fiz algo parecido com isso em outra situação e funcionou

    SUBSTRING(CAST(REPLACE(valorcontrato, '.', ',') AS VARCHAR), 1, 1) + '.' + SUBSTRING(CAST(REPLACE(valorcontrato, '.', ',') AS VARCHAR), 2, 100) AS valorcontrato FROM (SELECT SUM(CAST(valorcontrato AS MONEY)) / 100

    só que tentei adaptar e apanhei de 10 a 0 pro código ;x

    sexta-feira, 26 de agosto de 2011 21:14
  • Olá Jeferson,

    Desculpe a demora, a questão da "máscara" seria melhor analisar qual é objetivo da consulta. Ela será usada em alguma aplicação?

     


    Rafael Godoi Sabadin
    http://www.linkedin.com/in/rafaelgodoisabadin
    Classifique as respostas. O seu feedback é essencial.
    sábado, 27 de agosto de 2011 01:09
  • sim estou usando c# e vou exibir esses valores em um datalist ela é baseado a um carrinho que vai adicionando itens no banco e vai somando e formatando de acordo com o valor,.
    sábado, 27 de agosto de 2011 13:10
  • Entendi, então como o Marcelo citou, vocë terá que desenvolver uma função ou algo do tipo para fazer este tratamento. Poderá usar a logica que você postou (SUBSTRING(CAST(REPLACE(valorcontrato, '.', ',') AS VARCHAR), 1, 1) + '.' + SUBSTRING(CAST(REPLACE(valorcontrato, '.', ',') AS VARCHAR), 2, 100) AS valorcontrato FROM (SELECT SUM(CAST(valorcontrato AS MONEY)) / 100) conseguir o resultado que precisa.

    Espero ter ajudado, se for o caso, marque como útil e como resposta.

    Até mais.


    Rafael Godoi Sabadin
    http://www.linkedin.com/in/rafaelgodoisabadin
    Classifique as respostas. O seu feedback é essencial.
    sábado, 27 de agosto de 2011 14:42
  • apesar de estar quase -la encontrei mais um problema!  se meu valor é inserido 134,00 funciona bonitinho só que se ele tem 1.533,00 (ponto).

    o valor

    REPLACE(CAST(SUM(CAST(produtos.avista AS MONEY)) / 100 AS NUMERIC(10, 2)), '.', ',') AS total, me retornou 0,02 .

    ferrou! porque isso ?

     

    o.O

    sábado, 27 de agosto de 2011 15:09
  • apesar de estar quase -la encontrei mais um problema!  se meu valor é inserido 134,00 funciona bonitinho só que se ele tem 1.533,00 (ponto).

    o valor

    REPLACE(CAST(SUM(CAST(produtos.avista AS MONEY)) / 100 AS NUMERIC(10, 2)), '.', ',') AS total, me retornou 0,02 .

    ferrou! porque isso ?

     

    o.O


    estava lendo a respeito de formatar via código mesmo mas não contava com esse erro!
    sábado, 27 de agosto de 2011 15:10
  • armazeno eles em nvarchar  12,00 ,  140,00  1.440,00   ... ae faço uma função onde ele soma os valores duplicados ou seja do mesmo produto REPLACE(CAST(SUM(CAST(produtos.avista AS MONEY)) / 100 AS NUMERIC(10, 2)), '.', ',') AS total ae o que acontece o meu total de 12,00 + 12,00 ele traz 24,00 só que o meu total de  1.440,00 + 1.440,00 ele traz valor errado. o Ponto deve ta causando algum problema sempre que o valor obtem ponto ele gera o erro na soma!
    sábado, 27 de agosto de 2011 15:21
  • Jeferson, acontece o seguinte:

    Ao converter os valores textos em numericos, o SQL não entende o formato, visto que o ponto é o separador das casas decimais e a virgula não pertence a este formato.

    Uma boa pratica de programação seria que a coluna fosse um numerico e quando preciso, converse em texto para a exibição na sua aplicação.

    No seu caso, você terá que tratar para que os registros desta coluna, na conversão de texto para numerico, para retire os pontos e a virgula mude para o ponto no caso de separar as casas decimais. Ex: Valor texto: 1.355,00 -> converte para numerico: 1355.00.

    Desta forma você terá o resultado esperado.

    Espero ter ajudado, se for o caso, marque como útil e como resposta.

    Até mais.


    Rafael Godoi Sabadin
    http://www.linkedin.com/in/rafaelgodoisabadin
    Classifique as respostas. O seu feedback é essencial.
    sábado, 27 de agosto de 2011 15:30
  • então era o que eu estava tentando o problema é que eu preciso fazer essa remoção do ponto  aqui

    REPLACE(CAST(SUM(CAST(produtos.avista AS MONEY)) / 100 AS NUMERIC(10, 2)), '.', ',') AS total

     

    antes dele fazer isso ele remover o ponto substitur por nada por exemplo assim ele traria 1230,00  e o meu codigo somaria certinho ae depois em c# eu ia dar um jeito de incluir o ponto.

    ja tentei fazer replaces ali e não consegui!

    sábado, 27 de agosto de 2011 15:33
  • Segue um exemplo de como tratar isso:

    declare @avista nvarchar(10)
    set @avista = '1.230,00'

    select REPLACE(REPLACE(@avista,'.',''),',','.')

    select REPLACE(CAST(SUM(CAST(REPLACE(REPLACE(@avista,'.',''),',','.') AS MONEY)) / 100 AS NUMERIC(10,2)),'.',',') AS total

    Espero ter ajudado, se for o caso, marque como útil e como resposta.


    Rafael Godoi Sabadin
    http://www.linkedin.com/in/rafaelgodoisabadin
    Classifique as respostas. O seu feedback é essencial.
    sábado, 27 de agosto de 2011 15:46
  • BELEZA até essa parte resolvemos assim

      REPLACE(CAST(SUM(CAST(REPLACE(produtos.avista, '.', '') AS MONEY)) / 100 AS NUMERIC(10, 2)), '.', ',') AS tota

    ae funcionou de acordo. proxima etapa agora é formatar e colocar o ponto dinovo.

    sábado, 27 de agosto de 2011 16:17