Oracle 多行转多列及TO_NUMBER(varchar2)排序问题?

高手,请教下,Oracle 多行转多列及TO_NUMBER(varchar2)排序问题?
最新回答
你没那么贵

2025-03-30 10:54:43

首先你的size_no直接排序我不知道是按照什么排列的,因为你的size_no中存在#,所以是不可能转为number的。如果想利用number排序那么我建议用instr确定#的位置,然后用substr截取,截取后的值,再to_number进行排序。
至于转为三行那个,个人建议用rownum去做,先按照上面的方式排序,排序后用rownum标注行号,然后用行号-1,然后用行号去除以8,标出整除部分和余数。
可以到的:
rownum-1 整除部分得数 余数 size_no
0 0 0
1 0 1
2 0 2
。。。。。
7 0 7
8 1 0
9 1 1
10 1 2
........
18 2 2
19 2 3
而后利用余数部分进行case when(也就是列转行的工作),利用整除部分得数进行分组,这样就可以得到你要的那种结果了。
追问

第一个问题,“#”的位置不固定,可能是第2、3、4、5位,所以现在是先去掉“#”,然后to_number进行排序,再合并“#”,

 

 

只有当“PACKING_NO” 数据相同且大于8行才合并为一行,

第二个问题,就真的没办法了,不知能否提供可操作的例子,像之前那样,谢谢!

追答

instr不是能直接找到位置么,比如instr(size_no,'#')这个函数得到的位置也是不固定的,这个数-1,不就是#前面数字的长度么,然后你用substr截取后得到的就是

1

1.5

.....

类似这样的,然后再to_number,就成了。

只有当“PACKING_NO” 数据相同且大于8行才合并为一行?什么意思?你前面的20行可都是001.假设我的packing_no=005只有6行,那么是不是不合并为1行?

至于第二个问题,这样吧,我上传个文件,你慢慢看,我不写具体的语句了,太长了,我大概写出美国步骤的结果,自己慢慢参照,不过还是那句话,我没有环境,你在测试中可能会有一定的偏差,自己慢慢修正就好了。