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

MrA*_*den 0 sql sql-server-2008

我有一个表,当用户上传文件时,它会保存数据库中的文件大小.我想获得用户上传的所有大小的平均值.

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

|Size|
|1.20| 
|0.25|
|0.50|
Run Code Online (Sandbox Code Playgroud)

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

|Size| 
|0.65|
Run Code Online (Sandbox Code Playgroud)

当我试图获得平均值时,我得到了这个错误

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

编辑 我已将列类型更改为nvchar并在我将其转换为int时收到此错误消息

将nvarchar值'0,24'转换为数据类型int时转换失败.

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

消息8114,级别16,状态5,行11错误将数据类型nvarchar转换为数字.

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

gbn*_*gbn 7

错误显示您具有0,24瑞士或德国格式的数字.

这与0.24英国或美国格式不同.

因此,如果数据类型正确为十进制或浮点数,则0,24不允许,因为SQL Server并不真正处理大陆数字格式.请参阅SQL服务器与德国地区设置更多

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

因此,修复列数据类型和数据以修复错误.而且你也可以避免令人讨厌的客户端号码到字符串转换,例如24E-2它只被识别为浮点数.

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

123.456,79
234,567.89
34E5
0,24
0.24
2.3E-1
Run Code Online (Sandbox Code Playgroud)

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

 LIKE '%,%.%'
 LIKE '%.%,%'
 LIKE '%,%'
 LIKE '%E%'
Run Code Online (Sandbox Code Playgroud)


El *_*oco 5

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]
Run Code Online (Sandbox Code Playgroud)

当然我不知道你的表或查询实际上是什么......

正如其他人所说 - 如果您无论如何都要取平均值,那么您最好不要首先将数字转换为NVARCHARor并使用纯数字字段。VARCHAR

正如 gbn 所指出的,这是0,24大陆格式,所以......

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

  • 没问题 - gbn 的评论将证明对您具有更长期的价值:) (2认同)