2016-12-08 28 views
0

我需要特殊的自定義'反向'排序。我已經做了一些搜索,但還沒有找到答案。我們的倉庫採用這種格式:「A-05E」。我在下面列出了2個垃圾箱清單。 ASC_Order就是這樣。 Picking_Order是我需要在倉庫領料單上打印的自定義排序順序。當Bin名稱的第一個數字改變時,我們需要改變排序順序。 (一封信,如下所示)。 1)第一個數字總是按照ASC排序。 2)2位數字(Bin名稱中的位置3 & 4)是需要更改排序的位置。首先,他們被排序爲ASC。當第一個數字改變時(從下面的「A」到「B」),它們的排序需要改變爲DESC。當第一個數字再次變化時(從下面的「B」到「D」),排序需要變回ASC,等等。在SQL Server 2008R中自定義反向排序

ASC_Order  Picking_Order 
    A-05E   A-05E 
    A-07A   A-07A 
    B-00A   B-01D 
    B-01D   B-00A  
    D-02B   D-02B 
    D-07D   D-07D 
    D-08H   D-08H 
    D-09F   D-09F 
    D-14G   D-14G 
    M-00A   M-08A 
    M-01F   M-04B 
    M-04B   M-01F 
    M-08A   M-00A 

回答

2

我用子字符串和密集的級別來分配數字,以他們開始的字母組。然後通過字符串的第一個字符來命令該ASC。然後進一步命令它與案件陳述。如果排名是偶數,則命令它desc。如果排名是一個奇數,然後命令它asc。

這裏有一個DEMO

SELECT * 
FROM dbo.YourTable 
ORDER BY 
    SUBSTRING(ASC_Order, 1, 1) ASC, 
    CASE WHEN DENSE_RANK() OVER (ORDER BY SUBSTRING(ASC_Order, 1, 1)) % 2 = 0 THEN SUBSTRING(ASC_Order, 3, 2) END DESC, 
    CASE WHEN DENSE_RANK() OVER (ORDER BY SUBSTRING(ASC_Order, 1, 1)) % 2 <> 0 THEN SUBSTRING(ASC_Order, 3, 2) END ASC 

在一個側面說明,我可以用LEFT(asc_order, 1)獲得的第一個字符,但我已經有串在我的腦海,因爲你必須讓中間的2號。

編輯

想過這個多一點和使用子來獲得中間2是不必要的。這裏是縮短的代碼,我刪除了子字符串以獲取中間值2,並使用LEFT來獲取第一個字符。

SELECT * 
FROM dbo.YourTable 
ORDER BY 
    LEFT(ASC_Order, 1) ASC, 
    CASE WHEN DENSE_RANK() OVER (ORDER BY SUBSTRING(ASC_Order, 1, 1)) % 2 = 0 THEN ASC_Order END DESC, 
    CASE WHEN DENSE_RANK() OVER (ORDER BY SUBSTRING(ASC_Order, 1, 1)) % 2 <> 0 THEN ASC_Order END ASC 
+0

非常感謝!它對我們的應用程序來說很好。 – itstknecht