Sql ';将表达式转换为数据类型int';离开时,连接临时表

Sql ';将表达式转换为数据类型int';离开时,连接临时表,sql,sql-server,join,group-by,sum,Sql,Sql Server,Join,Group By,Sum,当我试图左键连接两个临时表时,我得到了算术溢出错误。在进行并集时,没有问题,当我将SELECT语句更改为不使用求和函数时也没有问题。这是我的两张桌子: SELECT SUM(count) count , EventType , month FROM #engine_final GROUP BY EventType , month UNION ALL SELECT SUM(count) count , EventType , month FRO

当我试图左键连接两个临时表时,我得到了算术溢出错误。在进行并集时,没有问题,当我将SELECT语句更改为不使用求和函数时也没有问题。这是我的两张桌子:

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

但这是我面临错误的时候。我想我可能已经达到了整数的极限,但我的数字只有2.6亿,所以这不可能。我遗漏了什么?

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

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 < /C> >中没有在<代码> EF 中,而另一方面,您可能需要考虑<代码>完全连接< /代码>,而不是<代码>左连接< /代码>:

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

非常好,非常感谢。然而,我不明白为什么我最初的方法是将行“相乘”。我可以麻烦你解释一下吗?我以为这只是简单地将基于其存在的计数与正确的月份相加?@jw11432:两个表中都有多行具有相同的月份,因此,
join
生成这些数据的笛卡尔乘积。因此,同一个值的总和是多次而不是一次。请在代码问题中给出一个--cut&paste&runnable代码,包括作为代码输入的最小代表性示例;期望和实际输出(包括逐字记录错误消息);标签和版本;清晰的说明和解释。尽可能少地给出代码,即显示为OK的代码,并通过显示为not OK的代码进行扩展。(调试基础。)用于包含DBMS和DDL(包括约束和索引)的SQL,并将其作为格式化为表的代码输入。暂停总体目标的工作,在第一个表达中删去代码,不要给出你的期望,请说出你的期望和原因。仅将图像用于不能表示为文本或扩充文本的内容。包括带有图像的图例/图例和说明。