oracle 多行,一行转换(10g以上)
2012-08-08 14:51
211 查看
--1. 多行转换成一行
-- 1.1 table 语句
CREATE TABLE "LOCAL_WPC04_01"."A_ROW_STR"
( "ID" NUMBER(*,0),
"COL" VARCHAR2(10 BYTE)
);
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (1,'a');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (1,'b');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (1,'c');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (2,'a');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (2,'d');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (2,'e');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (3,'c');
-- 1.2 转换语句 by Hierarchical
SELECT t.id id,
SUBSTR(sys_connect_by_path(t.col, ','), 2) str
FROM
(SELECT id,
col,
row_number() over(PARTITION BY id ORDER BY col) rn
FROM a_row_str
) t
WHERE connect_by_isleaf = 1
START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1
AND id = PRIOR id;
--2.一行转换成多行
--2.1 table 语句
CREATE TABLE A_STR_ROW
( "ID" NUMBER(*,0),
"STR" VARCHAR2(32 BYTE)
);
Insert into LOCAL_WPC04_01.A_STR_ROW (ID,STR) values (1,'a,b,c');
Insert into LOCAL_WPC04_01.A_STR_ROW (ID,STR) values (2,'a,d,e');
Insert into LOCAL_WPC04_01.A_STR_ROW (ID,STR) values (3,'c');
--2.2 转换语句
SELECT id,
LEVEL AS p,
rtrim(regexp_substr(str || ',', '.*?' || ',', 1, LEVEL), ',') AS cv
FROM a_str_row
CONNECT BY id = PRIOR id
AND PRIOR dbms_random.VALUE IS NOT NULL
AND LEVEL <=
length(regexp_replace(str || ',', '[^' || ',' || ']', NULL))
ORDER BY 1, 2;
--3. 多行转换成一行 for user_tab_columns
SELECT DISTINCT t.table_name tabname,
LISTAGG(t.column_name,',') within GROUP(
ORDER BY t.column_id ASC) OVER (PARTITION BY table_name) AS colname
FROM user_tab_columns t
-- 1.1 table 语句
CREATE TABLE "LOCAL_WPC04_01"."A_ROW_STR"
( "ID" NUMBER(*,0),
"COL" VARCHAR2(10 BYTE)
);
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (1,'a');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (1,'b');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (1,'c');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (2,'a');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (2,'d');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (2,'e');
Insert into LOCAL_WPC04_01.A_ROW_STR (ID,COL) values (3,'c');
-- 1.2 转换语句 by Hierarchical
SELECT t.id id,
SUBSTR(sys_connect_by_path(t.col, ','), 2) str
FROM
(SELECT id,
col,
row_number() over(PARTITION BY id ORDER BY col) rn
FROM a_row_str
) t
WHERE connect_by_isleaf = 1
START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1
AND id = PRIOR id;
--2.一行转换成多行
--2.1 table 语句
CREATE TABLE A_STR_ROW
( "ID" NUMBER(*,0),
"STR" VARCHAR2(32 BYTE)
);
Insert into LOCAL_WPC04_01.A_STR_ROW (ID,STR) values (1,'a,b,c');
Insert into LOCAL_WPC04_01.A_STR_ROW (ID,STR) values (2,'a,d,e');
Insert into LOCAL_WPC04_01.A_STR_ROW (ID,STR) values (3,'c');
--2.2 转换语句
SELECT id,
LEVEL AS p,
rtrim(regexp_substr(str || ',', '.*?' || ',', 1, LEVEL), ',') AS cv
FROM a_str_row
CONNECT BY id = PRIOR id
AND PRIOR dbms_random.VALUE IS NOT NULL
AND LEVEL <=
length(regexp_replace(str || ',', '[^' || ',' || ']', NULL))
ORDER BY 1, 2;
--3. 多行转换成一行 for user_tab_columns
SELECT DISTINCT t.table_name tabname,
LISTAGG(t.column_name,',') within GROUP(
ORDER BY t.column_id ASC) OVER (PARTITION BY table_name) AS colname
FROM user_tab_columns t
相关文章推荐
- Oracle 实现多行转换成一行 使用oracle 10g collect函数
- oracle一行数据转换成多行数据
- oracle 10g 更改字符集 em资料库中的部分数据不能正确转换成新字符集
- Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令
- Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令
- Oracle 多行数据合并成一行
- Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令
- Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令
- oracle实现多行合并为一行
- Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令
- 将多行文件转换为一行
- Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令 转自:南水江的鸽子窝
- Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令
- Oracle 10g 完全参考手册之DECODE实现交叉报表--数据行转换为报表的列
- linux shell 将多行转换为一行
- Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令 详细的
- 利用Oracle分析函数row_number和sys_connect_by_path实现多行数据合并为一行
- Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令
- 利用Oracle分析函数实现多行数据合并为一行
- Oracle数据导入导出imp/exp命令 10g以上expdp/impdp命令