none
Conversão de Dados RRS feed

  • Pergunta

  • Pessoal, tenho a tabela abaixo. A coluna mtm_par é do tipo varchar.


    MTM_PAR    NOM_PRODUTO
    42.800,91    AUTOBANK
    7.703,71    COMPOSIÇÃO
    68,31      COMPROR
    14.044,08    CREDIARIO
    9.792,67     CREDITO CONSIG
    24.827,22    GIRO
    13,78     HOT MONEY
    1,72     MICROCREDITO
    1,62     PARC.DIFER.CXA


    O que eu quero fazer é trazer por exemplo os registros onde a coluna mtm_par > '14.000'. Quando faço isso está me trazendo o seguinte:

    MTM_PAR  NOM_PRODUTO
    42.800,91   AUTOBANK
    7.703,71    COMPOSIÇÃO
    68,31    COMPROR
    9.792,67   CREDITO CONSIG
    24.827,22   GIRO

    Porém, vejam que está trazendo registros que não deveria. Deveria trazer apenas a primeira e última linha. E seu fizer a conversão pra númerico, decimal, ou float me dá um erro dizendo que não pode realizar a conversão.

    Como faço para resolver esse problema?

    terça-feira, 14 de fevereiro de 2012 16:43

Respostas

  • Rafa-martin

    o correto é vc ajustar o campo para decimal... fora isto vc precisará converter os dados e usar replaces... o que vai afetar a performance

    declare @tbTeste as table (MTM_PAR varchar(30), NOM_PRODUTO varchar(30))
    insert into @tbTeste values ('42.800,91','AUTOBANK'),
    ('7.703,71','COMPOSIÇÃO'),
    ('68,31','COMPROR'),
    ('14.044,08','CREDIARIO'),
    ('9.792,67','CREDITO CONSIG'),
    ('24.827,22','GIRO'),
    ('13,78','HOT MONEY'),
    ('1,72','MICROCREDITO'),
    ('1,62','PARC.DIFER.CXA')
    
    select * from @tbTeste
    where convert(decimal(8,2),replace(replace(mtm_par,'.',''),',','.')) >=14000


    Att.
    Marcelo Fernandes

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

    • Marcado como Resposta Eder Costa quarta-feira, 29 de fevereiro de 2012 14:45
    terça-feira, 14 de fevereiro de 2012 16:55
    Moderador
  • Rafa,

    O problema esta devido a normalização de . e , aonde no nosso idioma é diferente.

    Segue um exemplo:



    DECLARE @Tab TABLE(MTM_PAR VARCHAR(100), NOM_PRODUTO VARCHAR(100))



    INSERT INTO @Tab VALUES



    ('42.800,91','AUTOBANK'),



    ('7.703,71
    '
    ,'COMPOSIÇÃO'),



    ('68,31  ','COMPROR'),



    ('14.044,08
    '
    ,'CREDIARIO'),



    ('9.792,67  ','CREDITO
    CONSIG'
    ),



    ('24.827,22
    '
    ,'GIRO'),



    ('13,78  ','HOT MONEY'),



    ('1,72  ','MICROCREDITO'),



    ('1,62','PARC.DIFER.CXA')







    SELECT *



    FROM @Tab



    WHERE CAST(



    REPLACE(REPLACE(REPLACE(REPLACE(MTM_PAR, '.', 'a'), ',', 'b'), 'a', ','), 'b', '.')



    AS MONEY) > '14000'



    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta Eder Costa quarta-feira, 29 de fevereiro de 2012 14:45
    terça-feira, 14 de fevereiro de 2012 16:57
    Moderador
  • Rafa-martin

    neste caso, vc tem duas opçoes, incluir um where @campo isnull ou fazer query dinâmica

    a query dinâmica será menos pior que a primeira, vc esta fazendo isto em uma proc ou direto no aplicativo?


    Att.
    Marcelo Fernandes

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

    • Marcado como Resposta Eder Costa quarta-feira, 29 de fevereiro de 2012 14:45
    terça-feira, 14 de fevereiro de 2012 18:04
    Moderador

Todas as Respostas

  • Rafa-martin

    o correto é vc ajustar o campo para decimal... fora isto vc precisará converter os dados e usar replaces... o que vai afetar a performance

    declare @tbTeste as table (MTM_PAR varchar(30), NOM_PRODUTO varchar(30))
    insert into @tbTeste values ('42.800,91','AUTOBANK'),
    ('7.703,71','COMPOSIÇÃO'),
    ('68,31','COMPROR'),
    ('14.044,08','CREDIARIO'),
    ('9.792,67','CREDITO CONSIG'),
    ('24.827,22','GIRO'),
    ('13,78','HOT MONEY'),
    ('1,72','MICROCREDITO'),
    ('1,62','PARC.DIFER.CXA')
    
    select * from @tbTeste
    where convert(decimal(8,2),replace(replace(mtm_par,'.',''),',','.')) >=14000


    Att.
    Marcelo Fernandes

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

    • Marcado como Resposta Eder Costa quarta-feira, 29 de fevereiro de 2012 14:45
    terça-feira, 14 de fevereiro de 2012 16:55
    Moderador
  • Rafa,

    O problema esta devido a normalização de . e , aonde no nosso idioma é diferente.

    Segue um exemplo:



    DECLARE @Tab TABLE(MTM_PAR VARCHAR(100), NOM_PRODUTO VARCHAR(100))



    INSERT INTO @Tab VALUES



    ('42.800,91','AUTOBANK'),



    ('7.703,71
    '
    ,'COMPOSIÇÃO'),



    ('68,31  ','COMPROR'),



    ('14.044,08
    '
    ,'CREDIARIO'),



    ('9.792,67  ','CREDITO
    CONSIG'
    ),



    ('24.827,22
    '
    ,'GIRO'),



    ('13,78  ','HOT MONEY'),



    ('1,72  ','MICROCREDITO'),



    ('1,62','PARC.DIFER.CXA')







    SELECT *



    FROM @Tab



    WHERE CAST(



    REPLACE(REPLACE(REPLACE(REPLACE(MTM_PAR, '.', 'a'), ',', 'b'), 'a', ','), 'b', '.')



    AS MONEY) > '14000'



    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com

    • Marcado como Resposta Eder Costa quarta-feira, 29 de fevereiro de 2012 14:45
    terça-feira, 14 de fevereiro de 2012 16:57
    Moderador
  • OK. Já arrumei inclusive a normalização. Agora uma pequena dúvida.

    tenho o seguinte select:

    select 
    	*
    from 
    	#temp 
    where 
    	ISNULL(cod_produto,'') in (1,6)
    	and ISNULL(convert(decimal(15,2),replace(replace(mtm_par,'.',''),',','.')),0) >= 14000
    	and ISNULL(convert(decimal(15,2),replace(replace(accrual,'.',''),',','.')),0) >= 14000
    	and ISNULL(prazo_medio,0) > 20

    As condições que tenho no where são consequencia de um filtro que será feito em uma tela.

    Nesse filtro eu posso selecionar todas as opções. Que nesse caso seria o select que fiz acima. Porém, eu posso fazer um filtro por cod_produto e por mtm_par. Deixando os outos valores nulos. Ou por todos.

    quero fazer apenas um query de select para o filtro que o usuário pode fazer na tela. Selecionando alguns filtros ou todos. Ou apenas 1. Ou apenas, 3 ou todos...

    entenderam?

    terça-feira, 14 de fevereiro de 2012 17:32
  • Rafa-martin

    neste caso, vc tem duas opçoes, incluir um where @campo isnull ou fazer query dinâmica

    a query dinâmica será menos pior que a primeira, vc esta fazendo isto em uma proc ou direto no aplicativo?


    Att.
    Marcelo Fernandes

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

    • Marcado como Resposta Eder Costa quarta-feira, 29 de fevereiro de 2012 14:45
    terça-feira, 14 de fevereiro de 2012 18:04
    Moderador
  • descobri uma forma. é só colocar a query num variável e ir verificando quais estão com valor ou não.

    terça-feira, 14 de fevereiro de 2012 18:07
  • Rafa-marin

    isto é a query dinâmica :), vc cria uma variável com o comando e depois faz um EXEC (@variavel)


    Att.
    Marcelo Fernandes

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

    quarta-feira, 15 de fevereiro de 2012 11:10
    Moderador
  • Rafa,

    Isso mesmo, vale ressaltar que ao utilizar o comando Exec o SQL Server cria uma nova área de execução em segundo plano, neste caso a variável tem que estar criada dentro do bloco que o Exec() for trabalhar.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quarta-feira, 15 de fevereiro de 2012 11:18