Oracle多条数据组成一条
例如selectnamefromuser,查出来后是小明和小王,这是两行数据。我想出来后的结果在一个单元格里为小明,小王。我不要后台的方法,求大家给我找SQL语句怎么写?...
例如select name from user ,查出来后是小明和小王,这是两行数据。我想出来后的结果在一个单元格里为小明,小王。我不要后台的方法,求大家给我找SQL语句怎么写?我是用ORACLE的
展开
3个回答
展开全部
这个需求是很简单的,在MYSQL中可以使用聚合函数group_concat,在oracle中使用聚合函数wm_concat
不管是group_concat还是wm_concat都是逗号","作为字符分隔符的,但有时你希望要用“/"或";"作为分隔符的话,你最好使用自定义的聚合函数了,据我所知oracle是有自定义聚合函数而mysql没有。具体的自定义聚合函数请参照oracle官方文档
http://docs.oracle.com/cd/B19306_01/appdev.102/b14289/dciaggfns.htm#ABC1005888
-- **** 下面是一个wm_concat的使用示例 ****
col district_name for a15
select a.* from user_area a
DISTRICT_ID DISTRICT_NAME PARENT_ID
----------- --------------- ---------
10 北京市 00
10001 西城区 10
10002 平谷区 10
10003 朝阳区 10
11 天津市 00
11001 和平区 11
11002 河东区 11
11003 河西区 11
11004 南开区 11
12 河北省 00
12001 石家庄市 12
12002 保定市 12
--1。不分组的情况
select wm_concat(district_name) as namelist
from user_area;
NAMELIST
--------------------------------------------------------------------------------
北京市,西城区,平谷区,朝阳区,天津市,和平区,河东区,河西区,南开区,河北省,石家庄市,保定市
--2。以parent_id分组
select parent_id,wm_concat(district_name) as namelist
from user_area
group by parent_id;
PARENT_ID NAMELIST
--------- --------------------------------------------------
00 北京市,天津市,河北省
10 西城区,朝阳区,平谷区
11 和平区,河东区,南开区,河西区
12 石家庄市,保定市
下面是测试脚本及数据
-- *** 建表及测试数据 ***
DISTRICT_ID 区域ID
DISTRICT_NAME 区域名称
PARENT_ID 区域父ID
CREATE TABLE USER_AREA
(
DISTRICT_ID VARCHAR2(9 BYTE),
DISTRICT_NAME VARCHAR2(50 BYTE),
PARENT_ID VARCHAR2(9 BYTE)
);
SET DEFINE OFF;
Insert into USER_AREA Values('10', '北京市', '00');
Insert into USER_AREA Values('10001', '西城区', '10');
Insert into USER_AREA Values('10002', '平谷区', '10');
Insert into USER_AREA Values('10003', '朝阳区', '10');
Insert into USER_AREA Values('11', '天津市', '00');
Insert into USER_AREA Values('11001', '和平区', '11');
Insert into USER_AREA Values('11002', '河东区', '11');
Insert into USER_AREA Values('11003', '河西区', '11');
Insert into USER_AREA Values('11004', '南开区', '11');
Insert into USER_AREA Values('12', '河北省', '00');
Insert into USER_AREA Values('12001', '石家庄市', '12');
Insert into USER_AREA Values('12002', '保定市', '12');
COMMIT;
不管是group_concat还是wm_concat都是逗号","作为字符分隔符的,但有时你希望要用“/"或";"作为分隔符的话,你最好使用自定义的聚合函数了,据我所知oracle是有自定义聚合函数而mysql没有。具体的自定义聚合函数请参照oracle官方文档
http://docs.oracle.com/cd/B19306_01/appdev.102/b14289/dciaggfns.htm#ABC1005888
-- **** 下面是一个wm_concat的使用示例 ****
col district_name for a15
select a.* from user_area a
DISTRICT_ID DISTRICT_NAME PARENT_ID
----------- --------------- ---------
10 北京市 00
10001 西城区 10
10002 平谷区 10
10003 朝阳区 10
11 天津市 00
11001 和平区 11
11002 河东区 11
11003 河西区 11
11004 南开区 11
12 河北省 00
12001 石家庄市 12
12002 保定市 12
--1。不分组的情况
select wm_concat(district_name) as namelist
from user_area;
NAMELIST
--------------------------------------------------------------------------------
北京市,西城区,平谷区,朝阳区,天津市,和平区,河东区,河西区,南开区,河北省,石家庄市,保定市
--2。以parent_id分组
select parent_id,wm_concat(district_name) as namelist
from user_area
group by parent_id;
PARENT_ID NAMELIST
--------- --------------------------------------------------
00 北京市,天津市,河北省
10 西城区,朝阳区,平谷区
11 和平区,河东区,南开区,河西区
12 石家庄市,保定市
下面是测试脚本及数据
-- *** 建表及测试数据 ***
DISTRICT_ID 区域ID
DISTRICT_NAME 区域名称
PARENT_ID 区域父ID
CREATE TABLE USER_AREA
(
DISTRICT_ID VARCHAR2(9 BYTE),
DISTRICT_NAME VARCHAR2(50 BYTE),
PARENT_ID VARCHAR2(9 BYTE)
);
SET DEFINE OFF;
Insert into USER_AREA Values('10', '北京市', '00');
Insert into USER_AREA Values('10001', '西城区', '10');
Insert into USER_AREA Values('10002', '平谷区', '10');
Insert into USER_AREA Values('10003', '朝阳区', '10');
Insert into USER_AREA Values('11', '天津市', '00');
Insert into USER_AREA Values('11001', '和平区', '11');
Insert into USER_AREA Values('11002', '河东区', '11');
Insert into USER_AREA Values('11003', '河西区', '11');
Insert into USER_AREA Values('11004', '南开区', '11');
Insert into USER_AREA Values('12', '河北省', '00');
Insert into USER_AREA Values('12001', '石家庄市', '12');
Insert into USER_AREA Values('12002', '保定市', '12');
COMMIT;
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
试试这样行不行?
select substr(max(sys_connect_by_path(name,',')),2) name
from (select a.*,row_number()over() rn from user a )
start with rn=1
connect by rn1=prior rn
select substr(max(sys_connect_by_path(name,',')),2) name
from (select a.*,row_number()over() rn from user a )
start with rn=1
connect by rn1=prior rn
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |