如何实现行转列(横表转成纵表)

savagegarden1111 2008-09-15 12:21:08
如下,将下表

1 a+b+c
2 e+f+g

转换成
1 a
1 b
1 c
2 e
2 f
2 g

求转换方式的sql,越简单越好




...全文
424 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
heipi_silent 2008-09-18
  • 打赏
  • 举报
回复
select id, substr(name, id, 1) as name
from (
select row_number() over(order by a.id) as rn,
a.id,
a.name
from a, (select rownum from dual connect by rownum < 4) b
) x
BlueskyWide 2008-09-18
  • 打赏
  • 举报
回复
给个参考:
http://lengyue.javaeye.com/blog/195441
無名VF 2008-09-17
  • 打赏
  • 举报
回复
使用decode

select decode(col,'a',1,'b',1,'c',1,'e',2,'f',2,'g',2,col),col from tname;
cosio 2008-09-17
  • 打赏
  • 举报
回复
学习!
hebo2005 2008-09-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 richard_2010 的回复:]
引用 8 楼 Mr_Von 的回复:
使用decode

select decode(col,'a',1,'b',1,'c',1,'e',2,'f',2,'g',2,col),col from tname;

简单明了。
前面用connect by 的你们工作的时候也这样写的么?好麻烦啊
[/Quote]
先看懂题目再说噢,如果有简单的,谁会放着简单的不用,写这么一大段复杂的
seasir123 2008-09-17
  • 打赏
  • 举报
回复
学习!!!
hyrongg 2008-09-17
  • 打赏
  • 举报
回复
8i,9i,10G用:

SQL> select * from t_str_col;

ID C123
--------------------------------------- --------------------------------
1 v11,v21,v31
2 v12,v22,
3 v13,,v33
4 ,v24,v34
5 v15,,
6 ,,v35
7 ,,

7 rows selected

SQL>
SQL> SELECT id,
2 c123,
3 substr(c123, 1, instr(c123 || ',', ',', 1, 1) - 1) c1,
4 substr(c123,
5 instr(c123 || ',', ',', 1, 1) + 1,
6 instr(c123 || ',', ',', 1, 2) - instr(c123 || ',', ',', 1, 1) - 1) c2,
7 substr(c123,
8 instr(c123 || ',', ',', 1, 2) + 1,
9 instr(c123 || ',', ',', 1, 3) - instr(c123 || ',', ',', 1, 2) - 1) c3
10 FROM t_str_col
11 ORDER BY 1;

ID C123 C1 C2 C3
--------------------------------------- -------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
1 v11,v21,v31 v11 v21 v31
2 v12,v22, v12 v22
3 v13,,v33 v13 v33
4 ,v24,v34 v24 v34
5 v15,, v15
6 ,,v35 v35
7 ,,

7 rows selected

SQL>


10g也可以用:
SELECT id,
c123,
rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 1), ',') AS c1,
rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 2), ',') AS c2,
rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 3), ',') AS c3
FROM t_str_col
ORDER BY 1;
新鲜鱼排 2008-09-17
  • 打赏
  • 举报
回复
学习
richard_2010 2008-09-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Mr_Von 的回复:]
使用decode

select decode(col,'a',1,'b',1,'c',1,'e',2,'f',2,'g',2,col),col from tname;
[/Quote]
简单明了。
前面用connect by 的你们工作的时候也这样写的么?好麻烦啊
shahaizimxm 2008-09-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oracledbalgtu 的回复:]
SQL code
通用方法:
DROP TABLE test;
CREATE TABLE TEST (x NUMBER,y VARCHAR2(10));
INSERT INTO TEST VALUES(1,'a+b+c');
INSERT INTO TEST VALUES(2,'e+f+g');
--注意取要分几次的时候需要根据'+'的数量加1,如果不加1会丢最后一列
SELECT x,
SUBSTR('+' || y || '+',
INSTR('+' || y || '+', '+', 1, XX.RN) + 1,
INSTR('+' || y || '+', '+', 1, XX.RN + 1) -

[/Quote]
高手
savagegarden1111 2008-09-15
  • 打赏
  • 举报
回复
不太明白,能不能说得明白些
miaowenling 2008-09-15
  • 打赏
  • 举报
回复
使用 case ...
when ..then ..
when.. then ..
...
end
oracledbalgtu 2008-09-15
  • 打赏
  • 举报
回复

通用方法:
DROP TABLE test;
CREATE TABLE TEST (x NUMBER,y VARCHAR2(10));
INSERT INTO TEST VALUES(1,'a+b+c');
INSERT INTO TEST VALUES(2,'e+f+g');
--注意取要分几次的时候需要根据'+'的数量加1,如果不加1会丢最后一列
SELECT x,
SUBSTR('+' || y || '+',
INSTR('+' || y || '+', '+', 1, XX.RN) + 1,
INSTR('+' || y || '+', '+', 1, XX.RN + 1) -
INSTR('+' || y || '+', '+', 1, XX.RN) - 1) y
FROM TEST,
(SELECT ROWNUM RN
FROM DUAL
CONNECT BY ROWNUM <=
(SELECT MAX(LENGTH(y) - LENGTH(REPLACE(y, '+')) + 1)
FROM TEST)) XX
WHERE INSTR('+' || y, '+', 1, XX.RN) > 0
ORDER BY x;
--输出:
X Y
1 a
1 b
1 c
2 f
2 g
2 e



[Quote=引用楼主 midmid 的帖子:]
如下,将下表

1 a+b+c
2 e+f+g

转换成
1 a
1 b
1 c
2 e
2 f
2 g

求转换方式的sql,越简单越好
[/Quote]
mantisXF 2008-09-15
  • 打赏
  • 举报
回复
TRY IT ..


CREATE TABLE TEST_ABC (A NUMBER,B VARCHAR2(10));

INSERT INTO TEST_ABC VALUES(1,'a+b+c');
INSERT INTO TEST_ABC VALUES(1,'e+f+g');
INSERT INTO TEST_ABC VALUES(3,'h+i+j+k+l');

COMMIT;


SQL> SELECT * FROM TEST_ABC;

A B
---------- ----------
1 a+b+c
2 e+f+g
3 h+i+j+k+l

-- 1ST WAY:
SQL> SELECT A,
2 SUBSTR('+' || B || '+',
3 INSTR('+' || B || '+', '+', 1, RN) + 1,
4 INSTR('+' || B || '+', '+', 1, RN + 1) -
5 INSTR('+' || B || '+', '+', 1, RN) - 1) "NEW_B"
6 FROM TEST_ABC,
7 (SELECT ROWNUM RN
8 FROM DUAL
9 CONNECT BY ROWNUM <=
10 (SELECT MAX(LENGTH(B) - LENGTH(REPLACE(B, '+', '')))
11 FROM TEST_ABC)) OB
12 WHERE INSTR(B || '+', '+', 1, RN) > 0;

A NEW_B
---------- ------------------------
1 a
2 e
3 h
1 b
2 f
3 i
1 c
2 g
3 j
3 k
3 l

11 rows selected

-- 2ND WAY:
SQL> SELECT A,
2 SUBSTR('+' || B || '+',
3 INSTR('+' || B || '+', '+', 1, RN) + 1,
4 INSTR('+' || B || '+', '+', 1, RN + 1) -
5 INSTR('+' || B || '+', '+', 1, RN) - 1) "NEW_B"
6 FROM TEST_ABC,
7 (SELECT ROWNUM RN
8 FROM ALL_OBJECTS
9 WHERE ROWNUM <= (SELECT MAX(LENGTH(B) - LENGTH(REPLACE(B, '+', '')))
10 FROM TEST_ABC) + 1) OB
11 WHERE INSTR(B || '+', '+', 1, RN) > 0;

A NEW_B
---------- ------------------------
1 a
1 b
1 c
2 e
2 f
2 g
3 h
3 i
3 j
3 k
3 l

11 rows selected

SQL>

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧