算术溢出错误将表达式转换为数据类型int以获取基本统计信息

时间:2015-04-08 17:56:18

标签: sql sql-server azure azure-sql-database

我正在尝试执行计算平均值,最小值,最大值和计数的基本查询。

SELECT
 MIN(column) as min,
 MAX(column) as max,
 AVG(column) as avg,
 count(*) as count
FROM database.dbo.table;

其中列的类型为int,且数据库为azure sql standard。

作为回报,我得到一个错误:“将表达式转换为数据类型int”的算术溢出错误

为什么int首先会遇到一个转换为int的问题?是否有一些我可以添加的东西可以使所有数值类型的工作?

2 个答案:

答案 0 :(得分:2)

尝试使用count_big,如下所示:

SELECT
 MIN(column) as min,
 MAX(column) as max,
 AVG(column) as avg,
 count_big(*) as count
FROM database.dbo.table;

此外,您尝试将列作为BIGINT进行CAST:这样:

 SELECT
 MIN(CAST(column as BIGINT)) as min,
 MAX(CAST(column as BIGINT)) as max,
 AVG(CAST(column as BIGINT)) as avg,
 count_big(*) as count
FROM database.dbo.table;

答案 1 :(得分:2)

问题在于平均聚合或计数(*)。

如果列中值的总和大于2,147,483,647,则需要在平均值之前将列强制转换为 bigint ,因为SQL首先对列中的所有值求和,然后除以计数。

如果行数超过2,147,483,647,则需要使用 count_big

以下代码包含两个修复程序,因此它应该可以正常工作。

SELECT 
 MIN(column) as min,
 MAX(column) as max,
 AVG(Cast(Column AS BIGINT)) as avg,
 count_big(*) as count
 FROM database.dbo.table;

您不需要将big或max强制转换为bigint,因为这些值已经存在于表中而且没有溢出int数据类型。