如何对两个varchars进行十进制算术并将结果返回到别名列?

时间:2014-09-02 16:17:59

标签: sql-server tsql

我有两个类型为varchar的字段,其中包含数值或空字符串,后者我已过滤掉以避免Divide by Zero错误。

我试图确定num2与num1相关的百分比值,即(Num_2 * 1 / Num_1)。相对简单的数学。

我遇到的问题是我似乎无法进行数学计算,然后将其转换为十进制值。我一直收到Arithmetic overflow error converting int to data type numeric错误。

有人可以帮我解决投射问题吗?

4 个答案:

答案 0 :(得分:1)

您没有正确解释错误。

这不是关于将数学结果转换为浮点数,而是关于隐式类型转换之前计算等式。

您的表中有一些无法转换为数字的值,因为它们不是有效的数字或超出范围的数字。一行包含无效数据就足以使整个查询失败。

答案 1 :(得分:0)

也许你正在寻找类似的东西?

declare @table table (
  [numerator]     [sysname]
  , [denominator] [sysname]);
insert into @table
        ([numerator],[denominator])
values      (N'1',N'2'),
        (N'9999999999',N'88888888888');
select case
       when isnumeric([numerator]) = 1
            and isnumeric ([denominator]) = 1
           then
         cast([numerator] as [float]) / [denominator]
       else
         null
   end
from   @table; 

答案 2 :(得分:0)

这是你要找的吗?

select cast('25.5' as decimal(15, 8)) / cast('100.0' as decimal(15, 8))

上面的例子将返回:

0.25500000000000000000000

在这种情况下,我正在转换操作数类型,然后才能在分区中使用。

请记住用字段名称替换查询中的文字。

答案 3 :(得分:0)

你说的可以是数字或空字符串。 儿子尝试这样的事情:

SELECT
    (CASE WHEN NUM_2 = '' THEN 0 ELSE CAST(NUM_2 AS NUMERIC(15,4)) END)
    /
    (CASE WHEN NUM_1 = '' THEN 1 ELSE CAST(NUM_1 AS NUMERIC(15,4)) END)

你测试字符串是否为空。如果是,则使用0(或1,以避免除零)