求一条SQL语句~

alwin1016 2009-03-26 03:32:10
表结构,数据如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc

需要得到结果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc

要纯sql语句,不要定义函数之类的,谢谢!
...全文
158 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
白发程序猿 2009-03-27
  • 打赏
  • 举报
回复
用sys_connect_by_path和connect by prior联合实现
其实这就是行转列的问题
google一下行转列很多的
oracledbalgtu 2009-03-27
  • 打赏
  • 举报
回复
8i的库吧,只能用下面的方法了,如果value多于3个,再加LEAD(VALUE, n) OVER(PARTITION BY ID ORDER BY VALUE):


create table x(id int, value varchar(10));
insert into x values(1, 'aa');
insert into x values(1, 'bb');
insert into x values(2, 'aaa');
insert into x values(2, 'bbb');
insert into x values(2, 'ccc');

SELECT ID, VALUES1
FROM (SELECT ID,
RTRIM(VALUE || ', ' || LEAD(VALUE, 1)
OVER(PARTITION BY ID ORDER BY VALUE) || ', ' ||
LEAD(VALUE, 2) OVER(PARTITION BY ID ORDER BY VALUE) || ', ' ||
LEAD(VALUE, 3) OVER(PARTITION BY ID ORDER BY VALUE),
', ') VALUES1,
ROW_NUMBER() OVER(PARTITION BY ID ORDER BY VALUE) X
FROM X)
WHERE X = 1;
--输出:
ID VALUES1
1 aa, bb
2 aaa, bbb, ccc


[Quote=引用楼主 alwin1016 的帖子:]
表结构,数据如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc

需要得到结果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc

要纯sql语句,不要定义函数之类的,谢谢!
[/Quote]
magicbluestone 2009-03-27
  • 打赏
  • 举报
回复
一直想学个这个方法,终于看到了,谢谢
Paladin_china 2009-03-26
  • 打赏
  • 举报
回复
11楼很强大啊,不错不错的写法,收藏了
alwin1016 2009-03-26
  • 打赏
  • 举报
回复
算了,走人了,失望
alwin1016 2009-03-26
  • 打赏
  • 举报
回复
汗,大家来帮帮忙啊,,,真的很头大!
alwin1016 2009-03-26
  • 打赏
  • 举报
回复
提示 SYS_CONNECT_BY_PARTH 是无效的标识符
yf520gn 2009-03-26
  • 打赏
  • 举报
回复
你是ORACLE哪个版本?10以下的话用SYS_CONNECT_BY_PARTH可以实现。10G以上就用11楼的方法
alwin1016 2009-03-26
  • 打赏
  • 举报
回复
100分啊,没人要吗,,,帮帮我啊,,,这语句真的想不出来啊
alwin1016 2009-03-26
  • 打赏
  • 举报
回复
来人啊,,,
alwin1016 2009-03-26
  • 打赏
  • 举报
回复
都不行啊
lq20051610211 2009-03-26
  • 打赏
  • 举报
回复
来晚了~
chenqingyu 2009-03-26
  • 打赏
  • 举报
回复
SELECT ID, WMSYS.WM_CONCAT(VAL) AS ENAMES
FROM TABLE
GROUP BY ID;


10G或以上版本用这个...
否则参考6楼.
alwin1016 2009-03-26
  • 打赏
  • 举报
回复
8 楼不行啊
htl258_Tony 2009-03-26
  • 打赏
  • 举报
回复

CREATE TABLE tb(col1 int,col2 varchar(100))
INSERT tb SELECT 1,'aa'
UNION ALL SELECT 1,'bb'
UNION ALL SELECT 2,'aaa'
UNION ALL SELECT 2,'bbb'
UNION ALL SELECT 2,'ccc'

SELECT col1,
col2=MIN(col2)
+CASE
WHEN COUNT(*)=3 THEN ','
+(SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2)))
ELSE ''
END
+CASE
WHEN COUNT(*)>=2 THEN ','+MAX(col2)
ELSE ''
END
FROM tb a
GROUP BY col1
DROP TABLE tb

col1 col2
----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 aa,bb
2 aaa,bbb,ccc

(2 行受影响)
modify
htl258_Tony 2009-03-26
  • 打赏
  • 举报
回复

CREATE TABLE tb(col1 int,col2 varchar(100))
INSERT tb SELECT 1,'aa'
UNION ALL SELECT 1,'bb'
UNION ALL SELECT 2,'aaa'
UNION ALL SELECT 2,'bbb'
UNION ALL SELECT 2,'ccc'

SELECT col1,
col2=MIN(col2)
+CASE
WHEN COUNT(*)=1 THEN ''
ELSE ','+MAX(col2)
END
FROM tb
GROUP BY col1

DROP TABLE tb
GO

col1 col2
----------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 aa,bb
2 aaa,ccc

(2 行受影响)
htl258_Tony 2009-03-26
  • 打赏
  • 举报
回复

CREATE TABLE tb(col1 int,col2 varchar(1000))
INSERT tb SELECT 1,'aa'
UNION ALL SELECT 1,'bb'
UNION ALL SELECT 2,'aaa'
UNION ALL SELECT 2,'bbb'
UNION ALL SELECT 2,'ccc'

SELECT * INTO #t FROM tb ORDER BY col1,col2
DECLARE @col1 int,@col2 varchar(1000)
UPDATE #t SET
@col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,
@col1=col1,
col2=@col2
SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1
DROP TABLE tb,#t
GO

col1 col2
----------- ----------------------------------------------------------------------------------------------------
1 aa,bb
2 aaa,bbb,ccc

(2 行受影响)
dawugui 2009-03-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 alwin1016 的回复:]
我是Oracle数据库,,
[/Quote]
如下:
/*
标题:合并相同列的数据
作者:爱新觉罗.毓华
时间:2008-05-05
地点:广东深圳
*/

/*情况说明
NAME USERID
张三 KB001
张三 KB003
李四 KB001
李四 KB002
李四 KB003

用SQL实现表示如下:
NAME USERID
张三 KB001,KB003
李四 KB001,KB002,KB003
*/

create table tb(NAME varchar2(10) , USERID varchar2(10))
insert into tb values('张三' , 'KB001');
insert into tb values('张三' , 'KB003');
insert into tb values('李四' , 'KB001');
insert into tb values('李四' , 'KB002');
insert into tb values('李四' , 'KB003');

--1
select name,rtrim(
max(decode(USERID , 'KB001' , USERID || ',' , '')) ||
max(decode(USERID , 'KB002' , USERID || ',' , '')) ||
max(decode(USERID , 'KB003' , USERID || ',' , '')),',') userid
from tb
group by name

--2
SELECT NAME, ltrim(MAX(sys_connect_by_path(userid , ',')) , ',') userid
FROM (SELECT NAME , userid , row_number() over(PARTITION BY NAME ORDER BY userid) rn , rownum prn FROM tb)
START WITH rn = 1
CONNECT BY prn - 1 = PRIOR prn AND NAME = PRIOR NAME
GROUP BY NAME
ORDER BY NAME;

drop table tb

/*
NAME USERID
---------- ---------------------------------
李四 KB001,KB002,KB003
张三 KB001,KB003
2 rows selected
*/

dawugui 2009-03-26
  • 打赏
  • 举报
回复
--2005可以,如下.

/*
标题:按某字段合并字符串之一(简单合并)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-11-06
地点:广东深圳

描述:将如下形式的数据按id字段合并value字段。
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到结果:
id value
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即:group by id, 求 value 的和(字符串相加)
*/
--1、sql2000中只能用自定义的函数解决
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go

create function dbo.f_str(@id int) returns varchar(100)
as
begin
declare @str varchar(1000)
set @str = ''
select @str = @str + ',' + cast(value as varchar) from tb where id = @id
set @str = right(@str , len(@str) - 1)
return @str
end
go

--调用函数
select id , value = dbo.f_str(id) from tb group by id

drop function dbo.f_str
drop table tb


--2、sql2005中的方法
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go

select id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')
from tb
group by id

drop table tb


--3、使用游标合并数据
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
declare @t table(id int,value varchar(100))--定义结果集表变量
--定义游标并进行合并处理
declare my_cursor cursor local for
select id , value from tb
declare @id_old int , @id int , @value varchar(10) , @s varchar(100)
open my_cursor
fetch my_cursor into @id , @value
select @id_old = @id , @s=''
while @@FETCH_STATUS = 0
begin
if @id = @id_old
select @s = @s + ',' + cast(@value as varchar)
else
begin
insert @t values(@id_old , stuff(@s,1,1,''))
select @s = ',' + cast(@value as varchar) , @id_old = @id
end
fetch my_cursor into @id , @value
END
insert @t values(@id_old , stuff(@s,1,1,''))
close my_cursor
deallocate my_cursor

select * from @t
drop table tb
alwin1016 2009-03-26
  • 打赏
  • 举报
回复
我是Oracle数据库,,
加载更多回复(3)

17,086

社区成员

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

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