Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将varchar转换为十进制算术溢出将varchar转换为数据类型numeric时出错_Sql_Sql Server_Casting_Average - Fatal编程技术网

Sql 将varchar转换为十进制算术溢出将varchar转换为数据类型numeric时出错

Sql 将varchar转换为十进制算术溢出将varchar转换为数据类型numeric时出错,sql,sql-server,casting,average,Sql,Sql Server,Casting,Average,有人能帮我做这个简单的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转换为数据类型numeric时出现算术溢出错误 下面是SS列的一个示例: 28,99 10,99 11,99 NULL NULL 31,99 3

有人能帮我做这个简单的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转换为数据类型numeric时出现算术溢出错误

下面是SS列的一个示例:

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

你有两个问题。首先,当您对字符串数据类型使用NULLIF时,您是在隐式地将其转换为数字数据类型。您已将0.0指定为第二个参数。SQL Server不知道要选择什么,它可能会选择一个
浮点值
或其他内容。将字符串转换为数字后应调用NULLIF

其次,您没有为十进制数据类型指定精度和比例。根据默认精度和小数位数,十进制数据类型为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] 

替换为
选择avg(转换(NULLIF(将(Sim1SS,,,,,,,,,,,,,,,0.0)替换为十进制))作为MTN会给我相同的错误:好的,然后,您得到了非数值。您需要使用ISNUMERIC函数与CASE一起进行测试