2015-07-06 5 views
-1

Я пытаюсь создать строку под названием «Флаг», которая будет содержать счетчик, когда значение находится выше 2. Позже мне нужно будет суммировать флаг как счетчик.Вернуть INT из оператора Case

я в настоящее время:

CASE 
WHEN Value > 2 
    THEN 1 
ELSE 0 
END AS 'Flag', 

CASE 
    WHEN 'Flag' = 1 
     THEN 1 
    ELSE 0 
END AS 'FollowedUpCorrectly' 

Я получаю сообщение об ошибке:

Conversion failed when converting the varchar value 'Flag' to data type int.

Как я могу заставить 1 или 0, чтобы быть INT, чтобы сделать позже математику?

Я осмотрелся, и я не могу найти способ, который подходит.

+0

Подробно опишите вопрос –

+1

Почему вы не можете просто «ДЕЛО» Когда значение> 2 Затем 1 Осталось 0 Конец как FollowedUpCorrectly'? – Siyual

+1

здесь ** Флаг ** - значение варчара, сравнение ** [Флаг] = 1 ** для сравнения столбцов – debatanu

ответ

2

Чтобы иметь возможность использовать ранее созданные столбцы в избранных, вы «должны будете использовать, например, внешний применить, с чем-то вроде этого:

select 
    * 
from table1 
outer apply (
    select CASE WHEN Value > 2 THEN 1 ELSE 0 END AS Flag 
) X 
outer apply (
    select CASE WHEN X.Flag = 1 THEN 1 ELSE 0 END AS FollowedUpCorrectly 
) Y 

испытания этого в SQL Fiddle

+0

Это внешнее применение было тем, что мне нужно. Спасибо! – Nonpareil

1

Я мог бы неправильно понять, что вы после.

CASE 
WHEN Value > 2 
    THEN 1 
ELSE 0 
END AS 'Flag', 

CASE 
    WHEN 'Flag' = 1 
     THEN 1 
    ELSE 0 
END AS 'FollowedUpCorrectly' 

Если эти две строки в том же блоке кода, 'Flag' неизвестно во втором сазе.

Обновление: Как указал Сиюаль, Flag является строковым литералом. Попробуйте изменить имя на то, что не является зарезервированным словом.

+1

Технически «Флаг» известен, потому что '' Flag'' является строковым литералом. И вы не можете сравнить это с целым числом 1. Но с этим запросом есть несколько проблем. – Siyual

+0

Спасибо @Siyual - я обновил ответ, чтобы добавить вашу добавленную информацию. – jp2code

1

Вы можете использовать CTE или подзапрос создать флаг, а затем сделать свой случай о необходимости во внешнем запросе, как это:

;WITH q1 
AS (
    SELECT 
     col1 
     ,col2 
     ,col3 
     ,CASE 
      WHEN Value > 2 
       THEN 1 
      ELSE 0 
      END AS 'Flag' 
    FROM your_table --change this to match your table and column name 
    ) 
SELECT q1.col1 
     ,q1.col2 
     ,q1.col3 
     ,CASE 
     WHEN q1.Flag = 1 
       THEN 1 
     ELSE 0 
     END AS 'FollowedUpCorrectly' 
FROM q1; 
0

Вы сравниваете строку (» флаг ') т o int (1). Возможно, вы хотели сослаться на первый случай, который вы назвали «Флаг». Если да, попробуйте обратиться к нему, не используя одиночные кавычки. Затем анализатор распознает его и принимает его как int, какой он есть. Но «Флаг» - это строка. Флаг - это int.

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