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转换为数字.
我该怎么做才能解决这个问题.
错误显示您具有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)
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)
当然我不知道你的表或查询实际上是什么......
正如其他人所说 - 如果您无论如何都要取平均值,那么您最好不要首先将数字转换为NVARCHAR
or并使用纯数字字段。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)