Я работаю в SQL Server 2012. Мне нужно написать оператор sql, в котором я сначала присваиваю значение [Pay_Type], который является несуществующим столбцом (не уверен, можно ли его назвать переменной или нет) и на основе его значение, которое я хочу использовать в другом операторе case, как показано ниже
SELECT sp.First_Name, [Pay_Type] = CASE WHEN NOT EXISTS(SELECT '1' FROM
PERSON_SALARY ps WHERE ps.PARTY_ID = sp.PARTY_ID and ps.END_DATE IS NULL)
THEN 'Hourly' ELSE 'Salary' END,
HOURLY_RATE = CASE WHEN [Pay_Type] = 'Hourly' THEN pj.HOURLY_RATE ELSE
'0.00' END
FROM SEC_PERSON sp
LEFT OUTER JOIN PERSON_JOB pj ON sp.PERSON_ID = pj.PERSON_ID
WHERE sp.END_DATE IS NOT NULL
Но я получаю сообщение об ошибке «Неверное имя столбца Pay_Type».
Чтобы иметь возможность ссылаться на столбцы, которые вы создали, с помощью псевдонима, вам нужно сделать их внутри производной таблицы, перекрестного / внешнего применения или CTE
Возможный дубликат Ссылка на псевдоним в другом месте списка SELECT


Псевдонимы столбцов нельзя повторно использовать в том же SELECT, где они определены. Типичный ответ - использовать подзапрос или CTE. Еще мне нравится использовать боковое соединение:
SELECT sp.First_Name, s.Pay_Type,
HOURLY_RATE = (CASE WHEN s.Pay_Type = 'Hourly' THEN pj.HOURLY_RATE ELSE
'0.00' END)
FROM SEC_PERSON sp LEFT OUTER JOIN
PERSON_JOB pj
ON sp.PERSON_ID = pj.PERSON_ID OUTER APPLY
(SELECT (CASE WHEN NOT EXISTS (SELECT 1
FROM PERSON_SALARY ps
WHERE ps.PARTY_ID = sp.PARTY_ID and ps.END_DATE IS NULL
)
THEN 'Hourly' ELSE 'Salary'
END) as PayType
) s
WHERE sp.END_DATE IS NOT NULL
Не могли бы вы перейти к концу заявления Case и заняться
AS "Pay_Type"?