2013-06-18 144 views
-1

我有一个表格,用于在用户上载文件时将文件大小保存在数据库中。我想获得用户上传的所有大小的平均值。对于avg运算符,操作数数据类型nchar无效

我有以下的列的例子,证明了我想要的平均MB的

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

结果的大小是这样的

|Size| 
|0.65| 

当我试图让平均我得到这个错误

消息8117,级别16,状态1,行15操作数数据类型nchar是 我平均运营商无效。

编辑 我已经改变了列类型nvchar并获得此错误消息时,我将其转换为int

转换为nvarchar值“0.24”转换为失败时数据 类型int。

当我与一个小数尝试它,我得到这个错误信息

消息8114,级别16,状态5,11号线 错误转换数据类型为nvarchar到数字。

我该怎么办才能解决这个问题。

+3

更改列类型?为什么它是'nchar'? – MarcinJuraszek

+0

@MarcinJuraszek其实我已经尝试了不同的列类型,但仍然得到了类似上面的错误 – MrAden

+0

@gbn Good Spot! –

回答

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] 

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

正如其他人所说 - 如果你是要去taki ng无论如何,那么你会更好而不是首先将数字转换为NVARCHARVARCHAR并使用纯数字字段。

由于GBN笔记这是0,24大陆格式,所以......

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

感谢查询的工作 – MrAden

+2

没问题 - gbn的评论将证明对你有更多长期价值:) –

+0

我知道我会记住这一点,我使用查询的临时时间,并将改变设置尽快 – MrAden

6

错误显示你有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%' 
+0

感谢您的回答,但El Ronnoco给我的答案帮助了我 – MrAden

相关问题