数据1-18需要拆分成18行,从1到18;数据9-18需要拆分成9行,从9到18.
提sql题建议把表结构和模拟数据发出来,纯文字描述不一定描述得清楚,而且答题人还要自行去编写create table和insert语句,很浪费时间,这样就几乎没人会理你这种提问方式了。
我猜测,你这是一个表有18个列,想把这18个列做行列转换,变成18个行;第2个就是固定前8列,然后新增一列,新增的这一列来自于第9列到第18列的行列转换。
如果是我猜的这样,那么使用unpivot写法即可
create table test_20220423 (
c1 number,c2 number,c3 number,c4 number,c5 number,
c6 number,c7 number,c8 number,c9 number,c10 number,
c11 number,c12 number,c13 number,c14 number,
c15 number,c16 number,c17 number,c18 number
);
insert into test_20220423 values (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18);
commit;
select * from test_20220423 unpivot
(val for col in (c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17,c18) );
select * from test_20220423 unpivot
(val for col in (c9,c10,c11,c12,c13,c14,c15,c16,c17,c18) );
下面是将字符串'1-18周'拆成1-18的这18行的方式
with t as
(select '1-18周' a from dual)
select regexp_substr(replace(a, '周'), '[^-]+', 1, 1) + level-1 b
from t
connect by regexp_substr(replace(a, '周'), '[^-]+', 1, 1) + level-1 <=
regexp_substr(replace(a, '周'), '[^-]+', 1, 2)