操作数数据类型nchar对于avg运算符无效

时间:2013-06-18 08:58:37

标签: sql sql-server-2008

我有一个表,可以在用户上传文件时保存数据库中的文件大小。我想获得用户上传的所有大小的平均值。

我有以下列作为示例显示Mb的大小

|Size|
|1.20| 
|0.25|
|0.50|

我想要的平均结果是这样的

|Size| 
|0.65|

当我试图获得平均值时,我会收到此错误

  

消息8117,级别16,状态1,行15操作数数据类型nchar是   对于平均操作员无效。

修改 我已将列类型更改为nvchar,并在将其转换为int

时收到此错误消息
  

将nvarchar值'0,24'转换为数据时转换失败   输入int。

当我尝试使用小数时,我收到此错误消息

  

Msg 8114,Level 16,State 5,Line 11   将数据类型nvarchar转换为数字时出错。

我该怎么做才能解决这个问题。

2 个答案:

答案 0 :(得分:7)

错误显示您将0,24作为瑞士或德国格式的数字。

这与英国或美​​国格式的0.24不同。

因此,如果数据类型正确为decimal或float,则不允许0,24,因为SQL Server并不真正处理大陆数字格式。有关详情,请参阅SQL server with german regional settings

然后,当然也不是整数,因此int转换失败。

因此,修复列数据类型和数据以修复错误。而且你也可以避免令人讨厌的客户编号来转换24E-2之类的字符串转换,它只被识别为float。

如果您使用混合格式的千位分隔符怎么办?想象一下这个数据集

123.456,79
234,567.89
34E5
0,24
0.24
2.3E-1

修复数据需要进行一些LIKE搜索。至少这些是逐个修复每种格式。

 LIKE '%,%.%'
 LIKE '%.%,%'
 LIKE '%,%'
 LIKE '%E%'

答案 1 :(得分:2)

0.24不会转换为int,因为它有小数部分。

你需要做CAST([size] as DECIMAL(9,2))或其他一些......

虽然我们可以真正看到你的代码:)

将此CAST用作聚合的一部分......

SELECT [database], AVG(CAST([size] as DECIMAL(9,2))) AS [Average of Size]
FROM table
GROUP BY [database]

当然我不知道你的桌子或查询究竟是什么......

正如其他人所说的那样 - 如果你打算采取平均值,那么你最好将数字转换为NVARCHARVARCHAR in第一个地方并使用普通的数字字段。

正如gbn所说,这是0,24大陆格式所以......

SELECT [database], AVG(CAST(REPLACE([size],',','.') as DECIMAL(9,2))) AS [Average of Size]
FROM table
GROUP BY [database]