Арифметическое переполнение в зависимости от группировки по столбцам

Я получаю эту ошибку, но только при группировке по определенным столбцам:

      Arithmetic overflow error converting expression to data type int.

И я не могу уложить в голове, почему. Это запрос, вызывающий это (виновником является функция суммы):

      SELECT  a.AtgardAvvattningId, 
        a.ObjektId,
        sum(p.SlutLopLangd - p.StartLopLangd) As TotalLangd
    FROM AtgardAvvattning a 
        INNER JOIN Objekt o ON o.ObjektId = a.ObjektId 
        INNER JOIN Position p ON p.AvvattningAtgardId = a.AtgardAvvattningId 
        INNER JOIN Vna v ON v.PositionId = p.PositionId 
    WHERE v.OID IN (...) 
    GROUP BY a.AtgardAvvattningId, a.ObjektId, o.AtgardsDatum
    ORDER BY a.ObjektId

p.SlutLopLangd и p.StartLopLangd являются столбцами int. Если я конвертирую значения в bigint перед суммированием, это работает:

          sum(CONVERT(bigint, p.SlutLopLangd - p.StartLopLangd)) As TotalLangd

Давая этот результат:

И как бы вы ни суммировали строки, должно быть трудно достичь предела переполнения int.

1 ответ

Окончательное значение на самом деле не имеет значения. Что, вероятно, происходит, так это то, что в какой-то момент вы превышаете максимальное значение (2147 483 647) или минимальное значение (-2147 483 648) для и получаете ошибку.

Возьмите этот пример:

      SELECT SUM(V.I)
FROM (VALUES(2147483646),
            (2),
            (-2006543543))V(I);

Это, вероятно, вызовет ту же ошибку:

Ошибка арифметического переполнения при преобразовании выражения в тип данных int.

Результат SUMоднако будет 140940105 (значительно ниже максимума). Это потому , что если 2147483646а также 2сначала суммируются, то получается 2147483648, что больше, чем максимальное значение int. если ты CAST/ CONVERTсначала значение, вы не получите ошибку:

      SELECT SUM(CONVERT(bigint,V.I))
FROM (VALUES(2147483646),
            (2),
            (-2006543543))V(I);
Другие вопросы по тегам