发布网友 发布时间:2022-04-22 22:28
共7个回答
懂视网 时间:2022-05-07 08:04
如何高效能拆分一个字段为多行 我本意是将表中的一个字段拆分成多行,例如aaa,bbb拆分为 aaa bbb 现在测试如下: [sql] with t1 as ( select 3 c1,eee,fff,ggg c2 from dual UNION ALL select 2 c1,ccc,ddd c2 from dual UNION ALL SELECT 1 c1,aaa,bbb c2 F
如何高效能拆分一个字段为多行
我本意是将表中的一个字段拆分成多行,例如'aaa,bbb'拆分为
'aaa'
'bbb'
现在测试如下:
[sql]
with t1 as
(
select 3 c1,'eee,fff,ggg' c2 from dual UNION ALL
select 2 c1,'ccc,ddd' c2 from dual UNION ALL
SELECT 1 c1,'aaa,bbb' c2 FROM dual
)
select c1,LEVEL,replace(regexp_substr(c2,'[^,]+',1,level),',',' ') c2
from t1
connect BY level<=length(c2)-length(replace(c2,',',''))+1
order by c1,level
www.2cto.com
返回结果如下:
[sql]
C1 LEVEL C2
1 1 aaa
1 2 bbb
1 2 bbb
1 2 bbb
2 1 ccc
2 2 ddd
2 2 ddd
2 2 ddd
3 1 eee
3 2 fff
3 2 fff
3 2 fff
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
3 3 ggg
www.2cto.com
--======================================================
看起来connect by之后产生了大量重复数据,于是加入distinct后取得正确数据。
反思:
我构造的测试数据仅仅只有三行,最长的拆分资料仅3段'eee,fff,ggg',却产生了21笔资料。如果测试数据增多,或者需拆分的段
数量增多,那么connect by产生的数据将是海量的。
用此种方法实际处理生产库数据时,问题马上显现出来,仅17笔资料,最长拆分字段为8段,竟然产生了738万笔资料,尽管我使用
了distinct,依然慢的很。
解决方案:用Join方式取代connect by方式
[sql]
with t1 as
(
select 3 c1,'eee,fff,ggg' c2 from dual UNION ALL
select 2 c1,'ccc,ddd' c2 from dual UNION ALL
SELECT 1 c1,'aaa,bbb' c2 FROM dual
)
SELECT c1,
substr(t.ca,
instr(t.ca, ',', 1, d.lv) + 1,
instr(t.ca, ',', 1, d.lv + 1) -
(instr(t.ca, ',', 1, d.lv) + 1)) AS d
FROM (SELECT c1,
',' || c2 || ',' AS ca,
length(c2 || ',') - nvl(length(REPLACE(c2, ',')), 0) AS cnt
FROM t1) t,
(select rownum lv from
(select max(length(c2 || ',') - nvl(length(REPLACE(c2, ',')), 0)) mlc from t1)
connect by level<=mlc
)d
WHERE d.lv <= t.cnt
ORDER BY c1
www.2cto.com
结论:
对于表资料只有一笔的时候,用connect by一般不会有什么问题。但如果表中资料是多笔,则connect by会产生海量的重复资料。
用join方式可解决此类问题。
热心网友 时间:2022-05-07 05:12
1、打开excel,数据都在一个电子表格内。
2、将第一个电子表格变大
3、选中全部单元格,点击数据中的分列按钮。
4、在弹出窗口选择“固定宽度,然后点击下一步。
5、在新弹出的弹窗中我们就可以调整它们的间距,将它们的分列出来。然后点击完成。
6、完成效果如图。
热心网友 时间:2022-05-07 06:47
贴个图能贴 靠谱点不, ...................。。。。。。。 浪费时间
假设图1 是Sheet1, 图2是Sheet2
sheet2 E4 客户名称输入
=index(sheet1!B:B,row(A6)/3)
下拉公式即可
其他只需改变列号:
比如 办事处:
C4 输入 =index(sheet1!D:D,row(A6)/3)
==============
1052974911@qq.com
热心网友 时间:2022-05-07 08:38
假设是如下案例,对“计算你的个数”进行拆分。
数据---分列---固定宽度
结果显示:
热心网友 时间:2022-05-07 10:46
不太明白你的意思,如何叫从单行复制到合并行?
1:图1(sheet1表)和图2(sheet2表)有共同的部分,可以在图2(sheet2)中输入客户编码字段,然后用VLOOKUP函数引用sheet1中的数据,就可以直接输入到sheet2表中了,VLOOKUP函数的用法可以搜百度。
2.数据如何从一行拆成三行?
不知道你想实现什么效果,可以将一个单元格里的数据拆分成3列,在office2007及以上版本里的 数据---分列 里,然后复制 粘贴--选择性粘贴,选转置,就变成3行了。
热心网友 时间:2022-05-07 13:11
分行是完成不了的,不过你可以建立一个分好行的表样,把数据用vlookup取过来
热心网友 时间:2022-05-07 16:25
不太明白你的需求,图2的三行数据在图1的哪里?没看到啊