我正在尝试执行计算平均值,最小值,最大值和计数的基本查询。
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的问题?是否有一些我可以添加的东西可以使所有数值类型的工作?
答案 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数据类型。