【问题标题】:Operand data type nchar is invalid for avg operator操作数数据类型 nchar 对 avg 运算符无效
【发布时间】:2026-02-04 17:40:01
【问题描述】:

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

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

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

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

|Size| 
|0.65|

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

Msg 8117, Level 16, State 1, Line 15 操作数数据类型 nchar 是 对 avg 运算符无效。

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

将 nvarchar 值“0,24”转换为数据时转换失败 输入整数。

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

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

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

【问题讨论】:

  • 更改列类型?为什么是nchar
  • @MarcinJuraszek 实际上我已经尝试过使用不同的列类型,但我仍然收到类似上面的错误

标签: sql sql-server-2008


【解决方案1】:

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

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

因此,如果数据类型正确为十进制或浮点数,则不允许使用 0,24,因为 SQL Server 并不真正处理大陆数字格式。更多信息请见SQL server with german regional settings

那么,整数当然也不是整数,所以 int 转换失败。

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

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

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

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

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

【讨论】:

  • 感谢您的回答,但 El Ronnoco 给我的回答对我有帮助
【解决方案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,然后使用纯数字字段。

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

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

【讨论】:

  • 没问题 - gbn 的 cmets 将被证明对您具有更长期的价值 :)
  • 我知道我会记住这一点,我暂时使用查询,并将尽快更改设置