我有一个表,可以在用户上传文件时保存数据库中的文件大小。我想获得用户上传的所有大小的平均值。
我有以下列作为示例显示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转换为数字时出错。
我该怎么做才能解决这个问题。
答案 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]
当然我不知道你的桌子或查询究竟是什么......
正如其他人所说的那样 - 如果你打算采取平均值,那么你最好不将数字转换为NVARCHAR
或VARCHAR
in第一个地方并使用普通的数字字段。
正如gbn所说,这是0,24
大陆格式所以......
SELECT [database], AVG(CAST(REPLACE([size],',','.') as DECIMAL(9,2))) AS [Average of Size]
FROM table
GROUP BY [database]