SQL Server: игнорировать строки в функции SUM

Я выполняю функцию sum над столбцом. Но столбец также может иметь строковые значения. Я хочу, чтобы SQL Server игнорировал строковые значения и суммировал только строковые значения.

Например: столбец может иметь значения, такие как 16000Euro или 2588, или 3671.

Вход от пользователя и я не могу изменить валидацию в приложении на целое число

Я пробовал это, но все еще показывает ошибку:

SUM(CASE WHEN Type_New = 202 AND ISNUMERIC(Summe) = 1 
 THEN Summe 
 ELSE 0 
 END) AS total_Euro

Итак, как я могу игнорировать строковые значения при выполнении операции суммирования?

Ошибка, которую я получаю:

Ошибка преобразования значения nvarchar '2588. 'в типе данных int.

EDIT: я хочу, чтобы SQL игнорировал такие строковые значения и суммировал то, что он мог. Основная цель заключается в том, что Query не должен вызывать ошибки

6 ответов

Попробуйте ниже запрос, он будет работать отлично :)

SELECT SUM(CASE WHEN Type_New = 202 AND ISNUMERIC(Summe + '.0e0') = 1 
 THEN Summe 
 ELSE 0 
 END) AS total_Euro FROM TableName

IsNumeric возвращает 1, если значение varchar можно преобразовать в ANY тип номера (включая int, bigint, decimal, numeric, real & float). Значения типа 1e4,1., 2.0 создают проблему, если указанная выше проверка обходит эти значения не добавлено.


Функция ISNUMERIC рассматривает строки, которые содержат large numeric (например, 9223372036854775808), decimals (например, 12.4), currency figures цифре (например, $ 123) и значения с floating-point values (например, 1E2) для строк, которые могут быть преобразованы в числовые данные тип.

Теперь, чтобы вычислить Sum вам придется преобразовать string в integer [это предположение основано на данных образца, которые вы опубликовали), но факт, что строка может быть числовой, но не может быть конвертируемой в целое число; функция ISNUMERIC ограничена в том смысле, что она может сказать вам, может ли строка быть преобразована в любой тип числовых данных.

Поэтому, если ваш столбец не имеет строковых данных, таких как 1E3 или 12.4 или $123 которые являются numeric но не integers вы можете просто указать целевой столбец в int следующим образом и рассчитать сумму:

select SUM(CASE WHEN Type_New = 202 AND ISNUMERIC(Summe) = 1 
 THEN CAST(Summe AS INT) 
 ELSE 0 
 END) AS total_Euro
FROM test

иначе вы shoudl пойти на более общие функции, которые, как обсуждалось здесь.. http://sqlmag.com/t-sql/can-i-convert-string-integer


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

SELECT SUM(Summe) AS total_Euro
FROM someTable
WHERE Type_New = 202 AND ISNUMERIC(Summe) = 1


Вы не должны указывать столбец так же, как ключевое слово в SQL Server, если этого избежать нельзя, вы можете избежать имени столбца, заключая в квадратные скобки [Sum] как показано ниже

SELECT SUM(CASE WHEN Type = 202 AND ISNUMERIC([Sum]) = 1 THEN [Sum] ELSE 0 END) AS total_Euro


Попробуй это:

SUM (CASE 
 WHEN Type_New = 202 AND ISNUMERIC(Summe) = 1 THEN CAST(summe AS DECIMAL(9,2))
 ELSE 0 END) AS TotalEuro


Попробуй это

SUM(CASE WHEN Type = 202 AND case when Sum not like '%[^0-9]%' THEN Sum END ELSE 0 END) AS total_Euro

или

SUM(CASE WHEN Type = 202 AND ISNUMERIC(Sum+'.e0') = 1 THEN Sum ELSE 0 END) AS total_Euro

licensed under cc by-sa 3.0 with attribution.