排序问题

Snipaste_2022-04-13_08-48-09.png,数据库按照牌号降序排列,但因为牌号是字符串,导致(10)的没有排到(9)的上面到(1)了,这个怎么解决

FineReport 擎天小胖 发布于 2022-4-13 08:51
1min目标场景问卷 立即参与
回答问题
悬赏:3 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共4回答
最佳回答
0
数码天空Lv4初级互助
发布于2022-4-16 11:32

方法一:MS SQL中写一个函数只要把字段里的(1)到(9)循环替换成(01)到(09),然后在查询语句中以函数列排序即可。

方法二:增加一个隐藏辅助列,在单元格里(1)到(9)循环替换成(01)到(09),然后按该列排序即可。

最佳回答
0
CD20160914Lv8专家互助
发布于2022-4-13 08:53(编辑于 2022-4-13 09:54)

在数据库中单独再截取一列这些数据出来。然后再排序。。。不知道你是什么数据库,或者用帆软公式单独截取一列出来。在帆软中对这一列排序。。。。数量大的时候,,效率好的办法还是在sql里面处理。。。

select t2.* from (

select t.cola,

case when CHARINDEX('(',t.cola)=0 then 0  else replace(replace(right(replace(t.cola,'(',REPLICATE(' ',30)),10),')',''),' ','')*1 end as tc,

case when CHARINDEX('(',t.cola)='' then t.cola else  replace(substring(replace(t.cola,'(',REPLICATE(' ',50)),1,30),' ','') end  tc2

 from 

(

select '20220315-AA(9)' as cola

union all

select '20220315-AA(1)' as cola

union all

select '20220315-AA(5)' as cola

union all

select '20220315-AA(10)' as cola

union all

select '2022034F' as cola

) t

) t2

order by t2.tc

image.png

  • 擎天小胖 擎天小胖(提问者) sql server,数据库里面怎么截取,就像把10放到9上面
    2022-04-13 09:39 
  • CD20160914 CD20160914 回复 擎天小胖(提问者) 类似上面单独取两列出来。。再排序
    2022-04-13 09:54 
最佳回答
0
Z4u3z1Lv6专家互助
发布于2022-4-13 08:53(编辑于 2022-4-13 09:47)

这是字符串得按字符串的排序规则,想按数字来就得把它拆分转化成数字再排序

WITH A AS (

SELECT '2203002-AA(1)' [S]

UNION ALL

SELECT '2203002-AA(2)' [S]

UNION ALL

SELECT '2203002-AA(3)' [S]

UNION ALL

SELECT '2203002-AA(4)' [S]

UNION ALL

SELECT '2203002-AA(5)' [S]

UNION ALL

SELECT '2203002-AA(6)' [S]

UNION ALL

SELECT '2203002-AA(7)' [S]

UNION ALL

SELECT '2203002-AA(8)' [S]

UNION ALL

SELECT '2203002-AA(9)' [S]

UNION ALL

SELECT '2203002-AA(10)' [S]

UNION ALL

SELECT '2203002-AA(100)' [S]

)

SELECT *,(CASE WHEN PATINDEX('%([0-9])%',S)>0 THEN SUBSTRING(S,1,PATINDEX('%([0-9])%',S)-1) WHEN PATINDEX('%([0-9][0-9])%',S)>0 THEN SUBSTRING(S,1,PATINDEX('%([0-9][0-9])%',S)-1) WHEN PATINDEX('%([0-9][0-9][0-9])%',S)>0 THEN SUBSTRING(S,1,PATINDEX('%([0-9][0-9][0-9])%',S)-1)  ELSE '' END ) [前缀],(CASE WHEN PATINDEX('%([0-9])%',S)>0 THEN SUBSTRING(S,PATINDEX('%([0-9])%',S)+1,1) WHEN PATINDEX('%([0-9][0-9])%',S)>0 THEN SUBSTRING(S,PATINDEX('%([0-9][0-9])%',S)+1,2) WHEN PATINDEX('%([0-9][0-9][0-9])%',S)>0 THEN SUBSTRING(S,PATINDEX('%([0-9][0-9][0-9])%',S)+1,3)  ELSE -1 END ) [后续] FROM A ORDER BY 2 DESC,3 DESC

image.png

  • 擎天小胖 擎天小胖(提问者) 怎么拆分
    2022-04-13 09:24 
  • Z4u3z1 Z4u3z1 回复 擎天小胖(提问者) oracle?mysql?ms sql?
    2022-04-13 09:28 
  • 擎天小胖 擎天小胖(提问者) 回复 Z4u3z1 sql server
    2022-04-13 09:37 
  • Z4u3z1 Z4u3z1 回复 擎天小胖(提问者) 补充了,目前只判断了三位以内的,如果生产库里面有超过三位的,增加case 里面的判断就行了
    2022-04-13 09:48 
最佳回答
0
小学生三岁半Lv5初级互助
发布于2022-4-16 10:31

试一下这个:SELECT * FROM 表名字 order by convert(int,right(left(字段名,len(字段名)-1),len(left(字段名,len(字段名)-1))-11)) desc

  • 4关注人数
  • 405浏览人数
  • 最后回答于:2022-4-16 11:32
    请选择关闭问题的原因
    确定 取消
    返回顶部