2013-05-03 3 views
2

Я пытаюсь суммировать значения из двух строк. Чтобы сделать это, я вставляю строки в десятичные числа, добавляю их, а затем возвращаю обратно в строку для вывода. Также используйте max, чтобы избежать записи дублирования. У меня есть следующие строки в моем SP:Ошибка преобразования типа данных varchar в числовой при приведении varchar (max) в десятичный

Cast(Max(CASE WHEN QuestionID = 261 THEN CAST(Answer AS decimal) ELSE '' END) + Max(CASE WHEN QuestionID = 260 THEN CAST(Answer AS decimal) ELSE '' END) AS varchar) as Total

Поле Ответ VARCHAR (макс) и значение по умолчанию «».
Проблемы заключается в том, что я получаю сообщение об ошибке: Ошибка преобразование типа данных VARCHAR в числовой

ответ

3

части, которая неисправная является внутренним корпус:

CASE WHEN QuestionID = 261 
    THEN CAST(Answer AS decimal) 
    ELSE '' END 

CASE выражения (egabove) должен возвратите только один тип данных. В этом случае он не может возвращать десятичное число и varchar (пустая строка ''). Из-за type precedence результат от любой ветви отбрасывается до десятичной. Если ANY строка имеет QuestionID != 261, он попытается отбросить это значение '' в десятичное число и bam - ваша ошибка.

Вам нужно это:

Cast(Max(CASE WHEN QuestionID IN (261,260) AND ISNUMERIC(ANSWER) = 1 
       THEN CAST(Answer AS decimal) 
       ELSE 0 END) 
    AS varchar) as Total 
+0

все еще получаю сообщение об ошибке. Я нашел способ сделать это, он не самый изящный, но выполняет эту работу: 'Cast (Max (CASE WHEN QuestionID = 261 THEN CAST (Case When Answer = '' Then 0 Else CAST (Answer as decimal (9,2)) Конец как десятичный (9,2)) Конец) + Макс (CASE WHEN QuestionID = 260 THEN CAST (Case When Answer = '' Then 0 Else CAST (Отвечено как десятичный (9,2)) Закончить как десятичный (9 , 2)) Конец) AS varchar (Max)) как Total' – Milen

+0

Как выглядит ваш запрос сейчас? Вы заменили '' '' 'на 0? – RichardTheKiwi

+0

да, я сделал это. – Milen

0

Это немного более удобным для чтения ..

Cast(Max(CASE WHEN QuestionID = 261 THEN CAST(Case When Answer = '' Then 0 Else CAST(Answer as decimal(9,2)) End as decimal(9,2))End) + Max(CASE WHEN QuestionID = 260 THEN CAST(Case When Answer = '' Then 0 Else CAST(Answer as decimal(9,2)) End as decimal(9,2))End)AS varchar(Max)) as Total

Смежные вопросы