首页 > 解决方案 > 左连接临时表时,将表达式转换为数据类型 int 时出现算术溢出错误

问题描述

当尝试 LEFT JOIN 我拥有的两个临时表时,我遇到了算术溢出错误。执行 UNION 时没有问题,当我将 SELECT 语句更改为不使用 SUM 函数时也没有问题。这是我的两张表:

SELECT SUM(count) count
     , EventType
     , month
FROM #engine_final
GROUP BY EventType
       , month
UNION ALL
SELECT SUM(count) count
     , EventType
     , month
FROM #circumvent_final
GROUP BY EventType
       , month

结果如下:

在此处输入图像描述

因此,我正在尝试使用以下查询求和我的计数,按月分组:

SELECT SUM(ef.count) AS EngineStarts
     , SUM(cf.count) AS Circumventions
FROM #engine_final ef
     LEFT JOIN #circumvent_final cf ON ef.month = cf.month

但这是我遇到错误的时候。我想也许我已经达到了 INT 的极限,但我的数字只达到了 2.6 亿左右,所以不可能。我错过了什么?

标签: sqlsql-serverjoingroup-bysum

解决方案


您的联接使行数相乘。您应该先在子查询中预先聚合,然后加入:

SELECT ef.month, ef.EngineStarts, cf.Circumventions
FROM (
    SELECT month, SUM(count) EngineStarts
    FROM #engine_final 
    GROUP BY month
) ef
LEFT JOIN (
    SELECT month, SUM(cf.count) AS Circumventions
    FROM #circumvent_final 
    GROUP BY month
) cf ON ef.month = cf.month

我不确定您是否需要where子查询中的子句来过滤eventType- 如果需要,您可以轻松添加它们。

如果您有几个月cf不在ef其中,反之亦然,您可能需要考虑 aFULL JOIN而不是 a LEFT JOIN

SELECT 
    COALESCE(ef.month, cf.month) month, 
    COALESCE(ef.EngineStarts, 0) EngineStarts, 
    COALESCE(cf.Circumventions, 0) Circumventions
FROM (
    SELECT month, SUM(count) EngineStarts
    FROM #engine_final 
    GROUP BY month
) ef
FULL JOIN (
    SELECT month, SUM(cf.count) AS Circumventions
    FROM #circumvent_final 
    GROUP BY month
) cf ON ef.month = cf.month

推荐阅读