2015-10-27 123 views
2

在談到這個問題:How do I grab only the latest Invoice Number如何分類「A」,「B」,「AA」,「AB」和「AAA」等版本號?

我接受了使用MAX功能的答案,但羅伯特·麥基指出,這將導致在排序的值,例如:

 
‘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; 

有沒有人照顧,提供一個更好的答案或點我在正確的方向清理地雷嗎?

由於提前,

回答

7

嘗試是這樣的:

ORDER BY LEN(myValue),myValue 

這將命令1個字符,然後是2個字符等...

+0

簡單和簡單, 謝謝。 – Randy

1

不知道這是否符合你的 「好」 或 「清理」 的定義:

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

相關問題