У меня есть запрос ниже. Предполагается, что этот запрос просматривает таблицу моих учетных записей с моим параметром where. Это вернет все коды учетных записей, которые начинаются с ведущих трех букв «DAG». Возврат данных всегда осуществляется в формате, начинающемся с трех букв, за которыми следует число. Затем я хочу получить наибольшее число. Для этого я заказываю строку, преобразовывая ее в Int.
Я получаю эту ошибку ниже:
Msg 207, Level 16, State 1, Line 24
Invalid column name 'AccountCodeWithoutDAG '.
Вот мой SQL-запрос.
SELECT TOP 1
REPLACE(AccountCode, 'DAG', '') AS AccountCodeWithoutDAG
FROM
Accounts
WHERE
MangCode = 'ADFG'
ORDER BY
CONVERT(INT, AccountCodeWithoutDAG)
Что я делаю неправильно?
ГДЕ идет после ОТ
извините, это была моя плохая копия. Я отредактировал это


Проблема в AccountCodeWithoutDAG, это псевдоним, и его нельзя использовать в указанном порядке. Посмотрите, что я сделал при тестировании ниже, используйте оператор replace в части преобразования порядка с помощью
declare @AccountCode varchar(100)='DAG123456'
SELECT top 1 REPLACE(@AccountCode,'DAG','') AS AccountCodeWithoutDAG
Order by Convert(int, REPLACE(@AccountCode,'DAG',''))
ORDER запускается после оператора SELECT, поэтому псевдоним отображается
@AjanBalakumaran Полностью зависит от того, какую версию sql-сервера он использует. То, что вы описываете, является довольно новой функцией
Вы не можете использовать order by с псевдонимом convert
но вы можете попробовать использовать подзапрос, чтобы получить AccountCodeWithoutDAG, а затем order by.
SELECT TOP 1 AccountCodeWithoutDAG
FROM
(
SELECT REPLACE(AccountCode,'DAG','') AS AccountCodeWithoutDAG
FROM Accounts
where MangCode = 'ADFG'
) t1
Order by Convert(int, AccountCodeWithoutDAG )
Мне любопытно, как это работает против простого повторения convert в select и orderby. Чувствует себя намного чище, если делать это по-другому
Как указывали другие, присвоение вычисленного значения псевдониму в select не дает вам возможности использовать тот же псевдоним в последующих пунктах.
Способ сделать это красиво и организованно на сервере sql - это cross apply:
SELECT TOP 1 AccountCodeWithoutDAG
FROM Accounts
cross apply (select REPLACE(AccountCode,'DAG','') AS AccountCodeWithoutDAG ) as calcquery
where
MangCode = 'ADFG'
Order by Convert(int, AccountCodeWithoutDAG )
Вы должны любить крест применять! Много замечательных применений!
ВЫБРАТЬ ... ОТ ... ГДЕ ... ЗАКАЗАТЬ ...