如何对“A”,“B”,“AA”,“AB”和“AAA”等版本号进行排序?

时间:2015-10-27 20:37:49

标签: sql sorting sql-order-by

参考这个问题:How do I grab only the latest Invoice Number

我接受了一个使用MAX函数的答案,但Robert McKee指出这将导致排序值,例如:

‘A’
‘AA’
‘AAA’
‘AB’
‘B’

当我需要的是:

‘A’
‘B’
‘AA’
‘AB’
‘AAA’

我正试图找到一种方法来查找最新版本的发票。引用问题中接受的答案将起到一定作用。它确实满足了我的问题......但现在一个新问题值得回答自己的问题,而不是让我回去修改我原来的问题。所以......

我唯一需要处理的是发票编号本身。 发票编号的格式为##### XXX,其中#####是实际的发票编号,XXX是版本编号。 XXX可以是从'A'到'ZZZ'的任何地方。

这是我试图找到一个合理的工作(一个SQL测试用例):

DECLARE @TempTable TABLE (MyNumber int, MyString varchar(15));

INSERT @TempTable
VALUES (100, 'A'), (100, 'AAZ'), (100, 'B'), (100, 'AZ'), (100, 'C'), (100, 'Z'), (100, 'AA'), (100, 'AB');

SELECT TOP 1
RTRIM(CAST(MyNumber AS NVARCHAR(15)) + MyString) AS InvoiceNumber
FROM @TempTable
ORDER BY RIGHT(LEFT(MyString + SPACE(2), 3), 1) DESC, RIGHT(LEFT(MyString + SPACE(2), 2), 1) DESC, LEFT(MyString, 1) DESC;

是否有人愿意提供更好的答案或指出我正确的方向来清理我的?

提前致谢,

2 个答案:

答案 0 :(得分:8)

尝试这样的事情:

ORDER BY LEN(myValue),myValue

这将订购1个字符,然后是2个字符等...

答案 1 :(得分:1)

不确定这是否符合您对"更好"的定义或者"清理":

ORDER BY LEFT(MyString,1),SUBSTRING(MyString,2,1),SUBSTRING(MyString,3,1)