2013-06-18 180 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

相關問題