【问题标题】:Custom Reverse Sorting in SQL Server 2008RSQL Server 2008R 中的自定义反向排序
【发布时间】:2016-12-09 00:52:17
【问题描述】:

我需要特殊的自定义“反向”排序。我做了一些搜索,但还没有找到答案。我们的仓库箱采用以下格式:“A-05E”。我在下面列出了 2 个垃圾箱列表。 ASC_Order 就是这样。 Picking_Order 是我需要在 Warehouse Picking Ticket 上打印的自定义排序顺序。当 Bin Name 的第一个数字发生变化时,我们需要更改排序顺序。 (一封信,如下图)。 1) 第一位总是按 ASC 排序。 2) 2 位数字(Bin Name 中的位置 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

【问题讨论】:

    标签: sorting sql-server-2008-r2 ssms reverse


    【解决方案1】:

    我使用子字符串和稠密等级来按它们开头的字母将数字分配给垃圾箱组。然后按字符串的第一个字符对该 ASC 进行排序。然后用 case 语句进一步排序。如果排名是偶数,则按降序排列。如果排名是奇数,则按升序排列。

    这是一个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 
    

    【讨论】:

    • 非常感谢!它适用于我们的应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2019-12-06
    • 2010-12-24
    • 2014-04-29
    • 1970-01-01
    相关资源
    最近更新 更多