急求SQL语句,在线等!

FAFA_2007 2008-03-12 10:31:31
数据如下:
ID1 ID2 ID3 NAME OPINION
46a35099-0ee9-4225-a905-55327c696394 100 DWL2008026 qaqaqa qaqaqa推荐自己。
46a35099-0ee9-4225-a905-55327c696394 100 DWL2008026 qaqaqa 刘超推荐qaqaqa。
46a35099-0ee9-4225-a905-55327c696394 100 DWL2008026 qaqaqa 李大同推荐qaqaqa。

上面的数据如何才能并成以下的数据:
ID1 ID2 ID3 NAME OPINION
46a35099-0ee9-4225-a905-55327c696394 100 DWL2008026 qaqaqa qaqaqa推荐自己,刘超推荐qaqaqa,李大同推荐qaqaqa。


...全文
156 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fqbnet2050 2008-03-12
  • 打赏
  • 举报
回复
学习了,
goeasy2005 2008-03-12
  • 打赏
  • 举报
回复
学习一下,太有用了.
bqb 2008-03-12
  • 打赏
  • 举报
回复
if object_id('tb') is not null
drop table tb

go

create table tb(ID1 varchar(10),ID2 varchar(10), ID3 varchar(10), NAME varchar(10),OPINION varchar(10))
insert into tb
select 'fa12', 'fa13', 'fa14','发','同意1' union all
select 'fa12', 'fa13', 'fa14','发','同意2' union all
select 'fa12', 'fa13', 'fa14','发','同意3' union all
select 'fa21', 'fa23', 'fa24','发','同意1'

go


create function f_str(@id1 varchar(10),@id2 varchar(10),@id3 varchar(10),@name varchar(10))
returns varchar(100)
as
begin
declare @sql varchar(100)
set @sql=''
select @sql=@sql+','+opinion from tb where id1=@id1 and id2=@id2 and id3=@id3 and name=@name
set @sql=stuff(@sql,1,1,'')
return (@sql)
end

go

select id1,id2,id3,name,dbo.f_str(id1,id2,id3,name) as opinion from tb group by id1,id2,id3,name


drop function f_str
/*
id1 id2 id3 name opinion
------------------------------------------------
fa12 fa13 fa14 发 同意1,同意2,同意3
fa21 fa23 fa24 发 同意1
*/
bqb 2008-03-12
  • 打赏
  • 举报
回复
if object_id('tb') is not null
drop table tb

go

create table tb(ID1 varchar(10),ID2 varchar(10), ID3 varchar(10), NAME varchar(10),OPINION varchar(10))
insert into tb
select 'fa12', 'fa13', 'fa14','发','同意1' union all
select 'fa12', 'fa13', 'fa14','发','同意2' union all
select 'fa12', 'fa13', 'fa14','发','同意3' union all
select 'fa21', 'fa23', 'fa24','发','同意1'

go


create function f_str(@id1 varchar(10),@id2 varchar(10),@id3 varchar(10),@name varchar(10))
returns varchar(100)
as
begin
declare @sql varchar(100)
set @sql=''
select @sql=@sql+','+opinion from tb where id1=@id1 and id2=@id2 and id3=@id3 and name=@name
set @sql=stuff(@sql,1,1,'')
return (@sql)
end

go

select id1,id2,id3,name,dbo.f_str(id1,id2,id3,name) as opinion from tb group by id1,id2,id3,name


drop function f_str
/*
id1 id2 id3 name opinion
------------------------------------------------
fa12 fa13 fa14 发 同意1,同意2,同意3
fa21 fa23 fa24 发 同意1
*/
yinqi025 2008-03-12
  • 打赏
  • 举报
回复
1楼厉害呀...分组<=2和<=3的那种方法学习了...up
yinqi025 2008-03-12
  • 打赏
  • 举报
回复
这种只能自己写聚合函数...
FAFA_2007 2008-03-12
  • 打赏
  • 举报
回复
OK,知道了,谢谢!
FAFA_2007 2008-03-12
  • 打赏
  • 举报
回复
ID1 ID2 ID3 NAME OPINION
fa12 fa13 fa14 发 同意1。
fa12 fa13 fa14 发 同意2。
fa12 fa13 fa14 发 同意3。
fa21 fa23 fa24 发 同意1。
要求得出以下数据:
ID1 ID2 ID3 NAME OPINION
fa12 fa13 fa14 发 同意1,同意2,同意3。
fa21 fa23 fa24 发 同意1。

请问各位高手怎么写这条SQL语句?





liangCK 2008-03-12
  • 打赏
  • 举报
回复
3.3 各种字符串合并处理示例.sql


--各种字符串分函数

--3.3.1 使用游标法进行字符串合并处理的示例。
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3

--合并处理
--定义结果集表变量
DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))

--定义游标并进行合并处理
DECLARE tb CURSOR LOCAL
FOR
SELECT col1,col2 FROM tb ORDER BY col1,col2
DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)
OPEN tb
FETCH tb INTO @col1,@col2
SELECT @col1_old=@col1,@s=''
WHILE @@FETCH_STATUS=0
BEGIN
IF @col1=@col1_old
SELECT @s=@s+','+CAST(@col2 as varchar)
ELSE
BEGIN
INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1
END
FETCH tb INTO @col1,@col2
END
INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
CLOSE tb
DEALLOCATE tb
--显示结果并删除测试数据
SELECT * FROM @t
DROP TABLE tb
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
GO


/*==============================================*/


--3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
GO

--合并处理函数
CREATE FUNCTION dbo.f_str(@col1 varchar(10))
RETURNS varchar(100)
AS
BEGIN
DECLARE @re varchar(100)
SET @re=''
SELECT @re=@re+','+CAST(col2 as varchar)
FROM tb
WHERE col1=@col1
RETURN(STUFF(@re,1,1,''))
END
GO

--调用函数
SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
--删除测试
DROP TABLE tb
DROP FUNCTION f_str
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
GO

/*==============================================*/


--3.3.3 使用临时表实现字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3

--合并处理
SELECT col1,col2=CAST(col2 as varchar(100))
INTO #t FROM tb
ORDER BY col1,col2
DECLARE @col1 varchar(10),@col2 varchar(100)
UPDATE #t SET
@col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,
@col1=col1,
col2=@col2
SELECT * FROM #t
/*--更新处理后的临时表
col1 col2
---------- -------------
a 1
a 1,2
b 1
b 1,2
b 1,2,3
--*/
--得到最终结果
SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
--删除测试
DROP TABLE tb,#t
GO


/*==============================================*/

--3.3.4.1 每组 <=2 条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'c',3

--合并处理
SELECT col1,
col2=CAST(MIN(col2) as varchar)
+CASE
WHEN COUNT(*)=1 THEN ''
ELSE ','+CAST(MAX(col2) as varchar)
END
FROM tb
GROUP BY col1
DROP TABLE tb
/*--结果
col1 col2
---------- ----------
a 1,2
b 1,2
c 3
--*/

--3.3.4.2 每组 <=3 条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
UNION ALL SELECT 'c',3

--合并处理
SELECT col1,
col2=CAST(MIN(col2) as varchar)
+CASE
WHEN COUNT(*)=3 THEN ','
+CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2))) as varchar)
ELSE ''
END
+CASE
WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2) as varchar)
ELSE ''
END
FROM tb a
GROUP BY col1
DROP TABLE tb
/*--结果
col1 col2
---------- ------------
a 1,2
b 1,2,3
c 3
--*/
GO

34,837

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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