【问题标题】:Convert varchar to Decimal Arithmetic overflow error converting varchar to data type numericConvert varchar to Decimal 算术溢出错误将 varchar 转换为数据类型 numeric
【发布时间】:2014-09-15 21:11:42
【问题描述】:

请有人帮我完成这个简单的 sql 查询

SELECT avg(CAST(NULLIF(Sim1SS,0.0) as DECIMAL)) as MTN ,
avg(CAST(NULLIF(Sim2SS,0.0) as DECIMAL)) as Vodacom

FROM [Networks].[dbo].[Device] 

我收到以下错误:

将 varchar 转换为数字数据类型时出现算术溢出错误。

以下是 SS 列的示例:

28,99
10,99
11,99
NULL
NULL
31,99
31,99
NULL

【问题讨论】:

  • .替换,
  • SELECT avg(CAST(NULLIF(REPLACE(Sim1SS,',','.'),0.0) as DECIMAL)) as MTN 给我同样的错误:

标签: sql sql-server casting average


【解决方案1】:

你有两个问题。首先,当您在字符串数据类型上使用 NULLIF 时,您正在将其隐式转换为数字数据类型。您已指定 0.0 作为第二个参数。 SQL Server 不知道该选择什么,它可能会选择float 或其他东西。将字符串转换为数字后应调用 NULLIF

其次,您没有为 DECIMAL 数据类型指定精度和小数位数。根据MSDN,DECIMAL 数据类型的默认精度和小数位数为 18,0。如果您没有指定比例,数字将被截断。

所以,正确的语法应该是:

SELECT avg(NULLIF(CAST(Sim1SS as DECIMAL(18,2)), 0.00)) as MTN,
       avg(NULLIF(CAST(Sim2SS as DECIMAL(18,2)), 0.00)) as Vodacom
FROM [Networks].[dbo].[Device] 

顺便说一句,如果您的十进制符号区域设置不是句点 (.),那么您需要进行替换:

SELECT avg(NULLIF(CAST(REPLACE(Sim1SS, ',', '.') as DECIMAL(18,2)), 0.00)) as MTN,
       avg(NULLIF(CAST(REPLACE(Sim2SS, ',', '.') as DECIMAL(18,2)), 0.00)) as Vodacom
FROM [Networks].[dbo].[Device] 

如果您的数据没有经过清理,您需要使用 ISNUMERIC 函数,如下所示:

SELECT avg(NULLIF(case when isnumeric(Sim1SS)=1 then CAST(REPLACE(Sim1SS, ',', '.') as DECIMAL(18,2)) end, 0.00)) as MTN,
       avg(NULLIF(case when isnumeric(Sim2SS)=1 then CAST(REPLACE(Sim2SS, ',', '.') as DECIMAL(18,2)) end, 0.00)) as Vodacom
FROM [Networks].[dbo].[Device] 

【讨论】:

  • 好吧,那么你得到了非数值。您需要使用 ISNUMERIC 函数与 CASE 一起测试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-25
  • 1970-01-01
相关资源
最近更新 更多