表A中存储数据为:id name age sex
1 李四 20 女
1 王五 30 男
1 张三 40 女
求一这样显示数据的sql语句:id name-age sex
1 李四-20/王五-30/张三-40 女/男/女 select (name||’-‘||age ) name-age ,sex from A 这条只是得到横着的拼接,还需要求上下拼接的!谢谢!
1 李四 20 女
1 王五 30 男
1 张三 40 女
求一这样显示数据的sql语句:id name-age sex
1 李四-20/王五-30/张三-40 女/男/女 select (name||’-‘||age ) name-age ,sex from A 这条只是得到横着的拼接,还需要求上下拼接的!谢谢!
解决方案 »
- oracle 下 B.BRAN IN ('003') 和B.BRAN LIKE '%003%' 差别很大,请大家解释一下吧?
- 这段代码看着有点糊涂,哪位高人帮指点一下,谢谢
- 我要实现这样的情况应该如何写视图?
- 求一查询日期时间段的sql语句??在线等~~~~~~
- oracle 10能否导入到oracle 9?
- 我有一个字段aaa varchar2,里面存着1,3,14,149,.....,如何将其取出,并且以逗号拆分这个字符串呢?
- 求解一个SQL语句
- 急!如何通过卸库和装库命令实现把用户的对象从一个表空间移动到另一个表空间?
- 一个更新操作要先后更新三个表,如果某个更新失败,已经COMMIT的数据还可以ROLLBACK吗?
- 请大家进来帮忙解决问题,我很着急。谢谢大家了。
- 请问VS2010(C#)连接Oracle11g的字符串是什么?
- 怎样把xml导入到oracle!
ID NAME AGE SEX
---------- -------------------- ---------- ----------
1 张三 20 女
1 李四 30 女
2 王五 60 男
SQL> select id,
2 max(substr(SYS_CONNECT_BY_PATH("name-age",'/'),2)) "name-age",
3 max(substr(SYS_CONNECT_BY_PATH(sex,'/'),2)) sex
4 from
5 (
6 select id,name||'-'||age "name-age",sex,row_number() over(partition by id order by id) rn from t1
7 )
8 connect by prior rn = rn-1
9 group by id
10 ;
ID name-age SEX
---------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
1 张三-20/李四-30 女/女
2 王五-60 男
这条语句没看懂,请帮我解释一下,谢谢!
2 max(substr(SYS_CONNECT_BY_PATH("name-age",'/'),2)) "name-age",
3 max(substr(SYS_CONNECT_BY_PATH(sex,'/'),2)) sex
4 from
5 (
6 select id,name||'-'||age "name-age",sex,row_number() over(partition by id order by id) rn from t1
7 )
8 connect by prior rn = rn-1
9 group by id
这有一个差不多对,但是如果ID为1的有很多很多个,它就会截断一部分
2 rows inserted
SQL> select * from t1;
ID NAME AGE SEX
---------- -------------------- ---------- ----------
1 张三 20 女
1 李四 30 女
2 王五 60 男
1 张三 20 女
1 李四 30 女
SQL>
--正常啊
SQL> select id,
2 max(substr(SYS_CONNECT_BY_PATH("name-age",'/'),2)) "name-age",
3 max(substr(SYS_CONNECT_BY_PATH(sex,'/'),2)) sex
4 from
5 (
6 select id,name||'-'||age "name-age",sex,row_number() over(partition by id order by id) rn from t1
7 )
8 connect by prior rn = rn-1
9 group by id
10 ;
ID name-age SEX
---------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
1 张三-20/李四-30/李四-30/张三-20 女/女/女/女
2 王五-60 男
SQL>
create table TEST1
(
ID NUMBER,
NAME VARCHAR2(2000),
AGE VARCHAR2(2000),
SEX VARCHAR2(2000)
)
tablespace BIZ_DATASPACE
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
select id,
substr(SYS_CONNECT_BY_PATH("name-age",'/'),2) nameage,
substr(SYS_CONNECT_BY_PATH(sex,'/'),2) sex ,
CONNECT_BY_ISLEAF leaf
from
(
select id,name||'-'||age "name-age",sex,row_number() over(partition by id order by id) rn from t1
)
START WITH rn=1
connect by prior rn = rn-1 AND PRIOR ID=ID )
WHERE leaf=1
;
这个应该可以了,在4楼基础上改进了下
ID NAME AGE SEX
--- ---------- ---- -----
1 张三 20 女
1 李四 30 女
2 王五 60 男
1 赵六 22 男
2 苏三 33 女
2 周九 44 男
6 rows selected
SQL>
SQL> SELECT * FROM
2 (
3 select id, substr(SYS_CONNECT_BY_PATH("name-age",'/'),2) nameage,substr(SYS_CONNECT_BY_PATH(sex,'/'),2) sex,CONNECT_BY_ISLEAF leaf
4 from
5 (
6 select id,name||'-'||age "name-age",sex,row_number() over(partition by id order by id) rn from t1
7 )
8 START WITH rn=1
9 connect by prior rn = rn-1 AND PRIOR ID=ID
10 )
11 WHERE leaf=1 ;
ID NAMEAGE SEX LEAF
--- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----------
1 李四-30/赵六-22/张三-20 女/男/女 1
2 苏三-33/周九-44/王五-60 女/男/男 1
SQL>
replace(wm_concat(name || '-' || age) ||' '||
wm_concat(sex), ',', '/')
from t
group by id
直接用wm_concat这个函数就可以了