SQL Server 2008R 中的自定义反向排序
Custom Reverse Sorting in SQL Server 2008R
我需要一个特殊的自定义 'reverse' 排序。我已经做了一些搜索,但还没有找到答案。我们的仓库箱采用这种格式:"A-05E"。我在下面列出了 2 个垃圾箱列表。 ASC_Order 就是这样。 Picking_Order 是我需要打印在仓库领料单上的自定义排序顺序。当 Bin Name 的第一位数字发生变化时,我们需要更改排序顺序。 (一封信,如下图)。
1) 第一个数字总是按 ASC 排序。
2) 2 位数字(Bin 名称中的位置 3 和 4)是需要更改排序的地方。首先,它们被排序为 ASC。当第一个数字发生变化时(从下面的 "A" 到 "B"),它们的排序需要更改为 DESC。当第一个数字再次更改时(从下面的 "B" 到 "D"),排序需要改回 ASC,其余的 bin 依此类推。
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
我使用子字符串和密集排序按垃圾箱开头的字母为垃圾箱组分配编号。然后按字符串的第一个字符对该 ASC 进行排序。然后用案例陈述进一步订购它。如果等级是偶数,则将其降序排列。如果排名是奇数,则将其排序为 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
我需要一个特殊的自定义 'reverse' 排序。我已经做了一些搜索,但还没有找到答案。我们的仓库箱采用这种格式:"A-05E"。我在下面列出了 2 个垃圾箱列表。 ASC_Order 就是这样。 Picking_Order 是我需要打印在仓库领料单上的自定义排序顺序。当 Bin Name 的第一位数字发生变化时,我们需要更改排序顺序。 (一封信,如下图)。 1) 第一个数字总是按 ASC 排序。 2) 2 位数字(Bin 名称中的位置 3 和 4)是需要更改排序的地方。首先,它们被排序为 ASC。当第一个数字发生变化时(从下面的 "A" 到 "B"),它们的排序需要更改为 DESC。当第一个数字再次更改时(从下面的 "B" 到 "D"),排序需要改回 ASC,其余的 bin 依此类推。
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
我使用子字符串和密集排序按垃圾箱开头的字母为垃圾箱组分配编号。然后按字符串的第一个字符对该 ASC 进行排序。然后用案例陈述进一步订购它。如果等级是偶数,则将其降序排列。如果排名是奇数,则将其排序为 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