17,086
社区成员
发帖
与我相关
我的任务
分享
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
SELECT ID, WMSYS.WM_CONCAT(VAL) AS ENAMES
FROM TABLE
GROUP BY ID;
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
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 行受影响)
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 行受影响)
/*
标题:合并相同列的数据
作者:爱新觉罗.毓华
时间: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
*/
/*
标题:按某字段合并字符串之一(简单合并)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间: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