【问题标题】:need help in solving sql problems using order by to order building floor在使用 order by to order building floor 解决 sql 问题时需要帮助
【发布时间】:2018-08-06 11:02:24
【问题描述】:

我选择了这个建筑楼层数据:

6
5
4
3
2
1
UG
GM
G
LG
5B
5A
B1
B2

对于这种排序,我使用这种排序方式:

order by 
                    (case when ISNUMERIC(floorNo) = 1 then CAST(floorNo AS Int) end) desc , 
                     (case when ISNUMERIC(left(floorNo,1)) = 0 and ISNUMERIC(substring(floorNo,2,1)) = 1 then floorNo end) asc,
                    (case when ISNUMERIC(floorNo) = 0 and left(floorNo,1) <>'L' then floorNo end) desc

但我想变成这样:

6
5B
5A
5
4
3
2
1
UG
GM
G
LG
B1
B2

谁能帮我解决一下?

【问题讨论】:

  • 列中同时存在数字和字符数据将使在 SQL Server 中生成这种排序顺序变得非常困难。最好的办法可能是为数字和文本组件设置单独的列。
  • 另外,楼层名称也因人而异,例如GM可能是GF等。从技术上讲,没有任何逻辑可以工作。另外,由于子句的顺序,您的查询会变慢。所以请保留单独的数字列。

标签: sql-server sql-order-by


【解决方案1】:

如果你做了一个足够复杂的(一组)case语句,你最终将能够处理所有的可能性,但如果你有很多数据,它可能会运行得很慢。

如果我必须这样做,我可能会制作一个包含两列的单独查找表 (FloorOrder);这个楼层代码和一个订单列(整数)。创建一个脚本以使用所有各种可能性填充查找表 - 选择每层楼的最大数量的楼层、地下室和底层地板,并通过一些循环来实现所有可能性。然后在底层附近添加所有不同的楼层。确保订单号足够分散,以便在有人提出新选项时可以轻松地在其间添加其他代码(因为他们会这样做)。类似于这个子集。

Code   Order
2      2000
1C     1300
1B     1200
1A     1100
1      1000
UG     800
GM     500
G      0
LG     -300
B1     -1000

订单代码是什么并不重要,只要将列表按正确的顺序排序,在创建表格时可以轻松生成,并在间隙中留出空间放置东西。每当有人想出一个新的奇怪楼层代码时(我在我附近看到的一些是 M(Mezzanine,UM 表示 Upper Mezzanine 等),将新记录添加到 FloorOrder 表以适应它们。确保你的表有楼层代码索引

要使用它,请加入 FloorOrder 表,按 Order 列排序。

【讨论】:

    猜你喜欢
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2012-12-19
    • 2010-12-05
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多