2016-08-04 72 views
0

我有一个问题,试图使用某些语句,我做了正确的,我看到youtube,我仍然得到它不正确。这是我的问题SQL Server 2012 AVG声明

SELECT AVG(Salary) AS Average_Salary FROM Employee; 

Error: Operand data type varchar is invalid for avg operator. 

我做同样的事情,仍然听错了,但在youtube video它是正确的。

我会做什么错?

+1

首先,不应该将数值存储在字符串列中。其次,SQL Server将尝试转换,所以你必须有一些不好的值。第三,你应该在你的问题中包括样本数据和期望的结果。 –

回答

0
  • 你的数据不干净,或者它的格式不正确。

    SELECT SALARY FROM dbo.Employee WHERE ISNUMERIC(Salary) = 1

可能你会发现你的工资包括()在你的号码,不能被隐式转换被转换成数字的整数。

SQL Server很聪明,但它必须遵循转换的优先级。尝试将非数字型varchar隐式转换为整数通常被认为是非法转换。 AVG取值为explicit numeric,因此尝试隐式转换字符串会导致函数丢失信息(不能隐式执行)。

相反,转换值转换成数据类型,可以是与非数值如

SELECT AVG(CAST(Salary AS MONEY)) as SALARY_AVG 
FROM Employees 

为了更好地理解隐式转换和限制的灵活,见DATA TYPE CONVERSIONS

+0

如有疑问,请检查MSDN的功能 –

1

我认为错误信息很清楚。您可以使用try_convert()的值转换为数字:

SELECT AVG(TRY_CONVERT(DECIMAL(18, 4), Salary)) AS Average_Salary 
FROM Employee;