with sd as (select 'A' as id,'张三' as name,'2012-01-01' as datadate from dual union all select 'A' as id,'张三' as name,'2012-01-02' as datadate from dual union all select 'A' as id,'李四' as name,'2012-01-03' as datadate from dual union all select 'A' as id,'王五' as name,'2012-01-04' as datadate from dual union all select 'A' as id,'王五' as name,'2012-01-05' as datadate from dual union all select 'A' as id,'赵六' as name,'2012-01-06' as datadate from dual union all select 'B' as id,'王五' as name,'2012-01-01' as datadate from dual union all select 'B' as id,'王五' as name,'2012-01-02' as datadate from dual union all select 'B' as id,'赵六' as name,'2012-01-03' as datadate from dual union all select 'C' as id,'李四' as name,'2012-01-01' as datadate from dual union all select 'C' as id,'王五' as name,'2012-01-02' as datadate from dual union all select 'C' as id,'王五' as name,'2012-01-03' as datadate from dual) select t.id, wm_concat(t.name) as names from (select d.id, d.name, /*max(d.datadate) as datadate,*/ row_number() over(partition by d.id order by max(d.datadate) desc) as seq from sd d group by d.id, d.name) t where t.seq<3 group by t.id;
我只分享思路。 *列转行 *行转列 *多列转换成字符串 *多行转换成字符串 *字符串转换成多列 *字符串转换成多行下面分别进行举例介绍。首先声明一点,有些例子需要如下10g及以后才有的知识: a。掌握model子句, b。正则表达式 c。加强的层次查询讨论的适用范围只包括8i,9i,10g及以后版本。begin:1、列转行 CREATE TABLE t_col_row( ID INT, c1 VARCHAR2(10), c2 VARCHAR2(10), c3 VARCHAR2(10));INSERT INTO t_col_row VALUES (1, 'v11', 'v21', 'v31'); INSERT INTO t_col_row VALUES (2, 'v12', 'v22', NULL); INSERT INTO t_col_row VALUES (3, 'v13', NULL, 'v33'); INSERT INTO t_col_row VALUES (4, NULL, 'v24', 'v34'); INSERT INTO t_col_row VALUES (5, 'v15', NULL, NULL); INSERT INTO t_col_row VALUES (6, NULL, NULL, 'v35'); INSERT INTO t_col_row VALUES (7, NULL, NULL, NULL); COMMIT;SELECT * FROM t_col_row;1)UNION ALL 适用范围:8i,9i,10g及以后版本 SELECT id, 'c1' cn, c1 cv FROM t_col_row UNION ALL SELECT id, 'c2' cn, c2 cv FROM t_col_row UNION ALL SELECT id, 'c3' cn, c3 cv FROM t_col_row;若空行不需要转换,只需加一个where条件, WHERE COLUMN IS NOT NULL 即可。2)MODEL 适用范围:10g及以后 SELECT id, cn, cv FROM t_col_row MODEL RETURN UPDATED ROWS PARTITION BY (ID) DIMENSION BY (0 AS n) MEASURES ('xx' AS cn,'yyy' AS cv,c1,c2,c3) RULES UPSERT ALL ( cn[1] = 'c1', cn[2] = 'c2', cn[3] = 'c3', cv[1] = c1[0], cv[2] = c2[0], cv[3] = c3[0] ) ORDER BY ID,cn;3)collection 适用范围:8i,9i,10g及以后版本 要创建一个对象和一个集合: CREATE TYPE cv_pair AS OBJECT(cn VARCHAR2(10),cv VARCHAR2(10));CREATE TYPE cv_varr AS VARRAY(8) OF cv_pair;SELECT id, t.cn AS cn, t.cv AS cv FROM t_col_row, TABLE(cv_varr(cv_pair('c1', t_col_row.c1), cv_pair('c2', t_col_row.c2), cv_pair('c3', t_col_row.c3))) t ORDER BY 1, 2;
借用2楼的数据select wm_concat(name) as names from (select row_number() over(partition by id order by datadate desc) as rn, id, name, datadate from (select row_number() over(partition by id, name order by datadate desc) as rn1, id, name, datadate from sd) where rn1 = 1) where rn < 3 group by id========================================= 1 趙六,王五 2 趙六,王五 3 王五,李四
with sd as (select 'A' as id,'張三' as name,'2012-01-01' as datadate from dual union all select 'A' as id,'張三' as name,'2012-01-02' as datadate from dual union all select 'A' as id,'李四' as name,'2012-01-03' as datadate from dual union all select 'A' as id,'王五' as name,'2012-01-04' as datadate from dual union all select 'A' as id,'王五' as name,'2012-01-05' as datadate from dual union all select 'A' as id,'趙六' as name,'2012-01-06' as datadate from dual union all select 'B' as id,'王五' as name,'2012-01-01' as datadate from dual union all select 'B' as id,'王五' as name,'2012-01-02' as datadate from dual union all select 'B' as id,'趙六' as name,'2012-01-03' as datadate from dual union all select 'C' as id,'李四' as name,'2012-01-01' as datadate from dual union all select 'C' as id,'趙六' as name,'2012-01-02' as datadate from dual union all select 'C' as id,'王五' as name,'2012-01-03' as datadate from dual) select id ,wm_concat(name) from( select id,name from( select id,name,datadate,row_number() over(partition by id order by datadate desc) num1 from sd ) where num1 in (1,3) ) group by id -----------------------------------------------------1 A 趙六,王五 2 B 趙六,王五 3 C 王五,李四
select 'A' as id,'张三' as name,'2012-01-02' as datadate from dual union all
select 'A' as id,'李四' as name,'2012-01-03' as datadate from dual union all
select 'A' as id,'王五' as name,'2012-01-04' as datadate from dual union all
select 'A' as id,'王五' as name,'2012-01-05' as datadate from dual union all
select 'A' as id,'赵六' as name,'2012-01-06' as datadate from dual union all
select 'B' as id,'王五' as name,'2012-01-01' as datadate from dual union all
select 'B' as id,'王五' as name,'2012-01-02' as datadate from dual union all
select 'B' as id,'赵六' as name,'2012-01-03' as datadate from dual union all
select 'C' as id,'李四' as name,'2012-01-01' as datadate from dual union all
select 'C' as id,'王五' as name,'2012-01-02' as datadate from dual union all
select 'C' as id,'王五' as name,'2012-01-03' as datadate from dual)
select t.id, wm_concat(t.name) as names
from (select d.id,
d.name,
/*max(d.datadate) as datadate,*/
row_number() over(partition by d.id order by max(d.datadate) desc) as seq
from sd d
group by d.id, d.name) t where t.seq<3 group by t.id;
*列转行
*行转列
*多列转换成字符串
*多行转换成字符串
*字符串转换成多列
*字符串转换成多行下面分别进行举例介绍。首先声明一点,有些例子需要如下10g及以后才有的知识:
a。掌握model子句,
b。正则表达式
c。加强的层次查询讨论的适用范围只包括8i,9i,10g及以后版本。begin:1、列转行
CREATE TABLE t_col_row(
ID INT,
c1 VARCHAR2(10),
c2 VARCHAR2(10),
c3 VARCHAR2(10));INSERT INTO t_col_row VALUES (1, 'v11', 'v21', 'v31');
INSERT INTO t_col_row VALUES (2, 'v12', 'v22', NULL);
INSERT INTO t_col_row VALUES (3, 'v13', NULL, 'v33');
INSERT INTO t_col_row VALUES (4, NULL, 'v24', 'v34');
INSERT INTO t_col_row VALUES (5, 'v15', NULL, NULL);
INSERT INTO t_col_row VALUES (6, NULL, NULL, 'v35');
INSERT INTO t_col_row VALUES (7, NULL, NULL, NULL);
COMMIT;SELECT * FROM t_col_row;1)UNION ALL
适用范围:8i,9i,10g及以后版本
SELECT id, 'c1' cn, c1 cv
FROM t_col_row
UNION ALL
SELECT id, 'c2' cn, c2 cv
FROM t_col_row
UNION ALL
SELECT id, 'c3' cn, c3 cv FROM t_col_row;若空行不需要转换,只需加一个where条件,
WHERE COLUMN IS NOT NULL 即可。2)MODEL
适用范围:10g及以后
SELECT id, cn, cv FROM t_col_row
MODEL
RETURN UPDATED ROWS
PARTITION BY (ID)
DIMENSION BY (0 AS n)
MEASURES ('xx' AS cn,'yyy' AS cv,c1,c2,c3)
RULES UPSERT ALL
(
cn[1] = 'c1',
cn[2] = 'c2',
cn[3] = 'c3',
cv[1] = c1[0],
cv[2] = c2[0],
cv[3] = c3[0]
)
ORDER BY ID,cn;3)collection
适用范围:8i,9i,10g及以后版本
要创建一个对象和一个集合:
CREATE TYPE cv_pair AS OBJECT(cn VARCHAR2(10),cv VARCHAR2(10));CREATE TYPE cv_varr AS VARRAY(8) OF cv_pair;SELECT id, t.cn AS cn, t.cv AS cv
FROM t_col_row,
TABLE(cv_varr(cv_pair('c1', t_col_row.c1),
cv_pair('c2', t_col_row.c2),
cv_pair('c3', t_col_row.c3))) t
ORDER BY 1, 2;
from (select row_number() over(partition by id order by datadate desc) as rn,
id,
name,
datadate
from (select row_number() over(partition by id, name order by datadate desc) as rn1,
id,
name,
datadate
from sd)
where rn1 = 1)
where rn < 3
group by id=========================================
1 趙六,王五
2 趙六,王五
3 王五,李四
select 'A' as id,'張三' as name,'2012-01-02' as datadate from dual union all
select 'A' as id,'李四' as name,'2012-01-03' as datadate from dual union all
select 'A' as id,'王五' as name,'2012-01-04' as datadate from dual union all
select 'A' as id,'王五' as name,'2012-01-05' as datadate from dual union all
select 'A' as id,'趙六' as name,'2012-01-06' as datadate from dual union all
select 'B' as id,'王五' as name,'2012-01-01' as datadate from dual union all
select 'B' as id,'王五' as name,'2012-01-02' as datadate from dual union all
select 'B' as id,'趙六' as name,'2012-01-03' as datadate from dual union all
select 'C' as id,'李四' as name,'2012-01-01' as datadate from dual union all
select 'C' as id,'趙六' as name,'2012-01-02' as datadate from dual union all
select 'C' as id,'王五' as name,'2012-01-03' as datadate from dual)
select id ,wm_concat(name) from(
select id,name from(
select id,name,datadate,row_number() over(partition by id order by datadate desc) num1 from sd
)
where num1 in (1,3)
)
group by id
-----------------------------------------------------1 A 趙六,王五
2 B 趙六,王五
3 C 王五,李四