我有以下查询。该查询应该使用我的where参数查看我的帐户表。这将返回所有以前3个字母“ DAG”开头的帐户代码。数据返回的格式始终一致,以三个字母开头,后跟一个数字。然后,我想获得最大的数字。为此,我通过将字符串转换为Int来对其进行排序。
我收到以下错误消息:
Msg 207,第16层,状态1,第24行
无效的列名'AccountCodeWithoutDAG'。
这是我的SQL查询。
SELECT TOP 1
REPLACE(AccountCode, 'DAG', '') AS AccountCodeWithoutDAG
FROM
Accounts
WHERE
MangCode = 'ADFG'
ORDER BY
CONVERT(INT, AccountCodeWithoutDAG)
我在做什么错了?
答案 0 :(得分:3)
您不能将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 )
答案 1 :(得分:2)
正如其他人所指出的那样,在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 )
答案 2 :(得分:1)
问题是AccountCodeWithoutDAG,这是一个别名,不能按顺序使用 看看我在下面的测试中所做的工作,在
的转换部分中使用您的replace语句declare @AccountCode varchar(100)='DAG123456'
SELECT top 1 REPLACE(@AccountCode,'DAG','') AS AccountCodeWithoutDAG
Order by Convert(int, REPLACE(@AccountCode,'DAG',''))