1

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

我有以下列为例,它显示了 Mb 的大小

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

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

|Size| 
|0.65|

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

消息 8117,级别 16,状态 1,第 15 行操作数数据类型 nchar 对 avg 运算符无效。

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

将 nvarchar 值“0,24”转换为数据类型 int 时转换失败。

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

消息 8114,级别 16,状态 5,第 11 行将数据类型 nvarchar 转换为数字时出错。

我能做些什么来解决这个问题。

4

2 回答 2

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

修复数据需要一些 LIKE 搜索。至少这些来一一修复每种格式。

 LIKE '%,%.%'
 LIKE '%.%,%'
 LIKE '%,%'
 LIKE '%E%'
于 2013-06-18T09:19:59.343 回答
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]

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

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

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

SELECT [database], AVG(CAST(REPLACE([size],',','.') as DECIMAL(9,2))) AS [Average of Size]
FROM table
GROUP BY [database]
于 2013-06-18T09:14:48.793 回答