求sql:按主键group by后,名称字段用逗号连接起来

吃饱饱吖 2010-10-11 03:15:15
求sql:按主键group by后,名称字段用逗号连接起来

Create Table #TEST
(ID Varchar(10), Name Nvarchar(10))
Insert #TEST Values('01', N'小张')
Insert #TEST Values('01', N'小王')
Insert #TEST Values('02', N'小王')
Insert #TEST Values('02', N'小陈')
Insert #TEST Values('02', N'张三')
Insert #TEST Values('03', N'李四')
Insert #TEST Values('03', N'王武')



希望得到的结果:

id name
01 小张,小王
02 小王,小陈,张三
03 李四,王武
...全文
808 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
闹铃 2010-10-11
  • 打赏
  • 举报
回复

Create Table #TEST
(ID Varchar(10), Name Nvarchar(10))
Insert #TEST Values('01', N'小张')
Insert #TEST Values('01', N'小王')
Insert #TEST Values('02', N'小王')
Insert #TEST Values('02', N'小陈')
Insert #TEST Values('02', N'张三')
Insert #TEST Values('03', N'李四')
Insert #TEST Values('03', N'王武')
;with cte as
(
select id,
MAX(case when row=1 then Name+',' else '' end)+
MAX(case when row=2 then Name+',' else '' end)+
MAX(case when row=3 then Name+',' else '' end)+
MAX(case when row=4 then Name+',' else '' end)as jg
from (select ROW_NUMBER()over(partition by id order by (select 1))as row,
id,name
from #TEST)as t
group by id
)
select id,LEFT(jg,LEN(jg)-1)as jb
from cte;
/**
id jb
---------- --------------------------------------------
01 小张,小王
02 小王,小陈,张三
03 李四,王武

(3 行受影响)
**/
Rotel-刘志东 2010-10-11
  • 打赏
  • 举报
回复
--上边代码不够紧凑又修改了一下如下
--> 生成测试数据表: [tb]
IF OBJECT_ID('TEST') IS NOT NULL
DROP TABLE TEST
GO
CREATE TABLE TEST (ID Varchar(10), Name Nvarchar(10))
INSERT INTO TEST
SELECT '01', N'小张' UNION ALL
SELECT '01', N'小王' UNION ALL
SELECT '02', N'小王' UNION ALL
SELECT '02', N'小陈' UNION ALL
SELECT '02', N'张三'union all
SELECT '03', N'李四' UNION ALL
SELECT '03',N'王武'

--SELECT * FROM [tb]

-->SQL查询如下:
--SQL2000以上版本:
IF OBJECT_ID('dbo.f_str')>0
DROP FUNCTION dbo.f_str
GO
CREATE FUNCTION dbo.f_str
(
@id INT
)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @r VARCHAR(1000)
SELECT @r = ISNULL(@r+',', '') + name
FROM test
WHERE id = @id
RETURN @r
END
GO
--查询
SELECT DISTINCT id,dbo.f_str(id) name from test
--结果
/*
id name
------ -------------
01 小张,小王
02 小王,小陈,张三
03 李四,王武
*/
Rotel-刘志东 2010-10-11
  • 打赏
  • 举报
回复
-为什么把#test该为test 自定义函数中不支持临时表#test
Rotel-刘志东 2010-10-11
  • 打赏
  • 举报
回复
----SQL2000以上版本:
--> 生成测试数据表: test
IF OBJECT_ID('TEST') IS NOT NULL

DROP TABLE TEST

GO

CREATE TABLE TEST (ID Varchar(10), Name Nvarchar(10))

INSERT INTO TEST

SELECT '01', N'小张' UNION ALL

SELECT '01', N'小王' UNION ALL

SELECT '02', N'小王' UNION ALL

SELECT '02', N'小陈' UNION ALL

SELECT '02', N'张三'union all
SELECT '03', N'李四' UNION ALL
SELECT '03',N'王武'



--SELECT * FROM test


-->SQL查询如下:

--SQL2000以上版本:

IF OBJECT_ID('dbo.f_str')>0

DROP FUNCTION dbo.f_str

GO

CREATE FUNCTION dbo.f_str

(

@id INT

)

RETURNS VARCHAR(1000)

AS

BEGIN

DECLARE @r VARCHAR(1000)

SELECT @r = ISNULL(@r+',', '') + name

FROM test

WHERE id = @id

RETURN @r

END

GO
--查询
SELECT DISTINCT id,dbo.f_str(id) name from test

--结果
/*
id name
------ -------------
01 小张,小王
02 小王,小陈,张三
03 李四,王武
*/
fpzgm 2010-10-11
  • 打赏
  • 举报
回复
select id,stuff((select ','+name from #TEST where id=t.id for xml path('')),1,1,'')
from #TEST t group by id
kevn 2010-10-11
  • 打赏
  • 举报
回复
补充我的事2000写法,2005可以像1楼2楼那样
黄_瓜 2010-10-11
  • 打赏
  • 举报
回复
Create   Table   #TEST       
(ID Varchar(10), Name Nvarchar(10))
Insert #TEST Values('01', N'小张')
Insert #TEST Values('01', N'小王')
Insert #TEST Values('02', N'小王')
Insert #TEST Values('02', N'小陈')
Insert #TEST Values('02', N'张三')
Insert #TEST Values('03', N'李四')
Insert #TEST Values('03', N'王武')


select id,stuff((select ','+name from #TEST where id=t.id for xml path('')),1,1,'')
from #TEST t group by id
/*
id
---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
01 小张,小王
02 小王,小陈,张三
03 李四,王武

(3 行受影响)



*/
kevn 2010-10-11
  • 打赏
  • 举报
回复
create function test 
returns varchar(1000)
as
begin
declare @ename varchar(1000)
set @ename = ''
select @ename = @ename+','+rtrim(isnull(name,'')) from #test where
return stuff(@ename,1,1,'')
end
黄_瓜 2010-10-11
  • 打赏
  • 举报
回复
Create   Table   #TEST       
(ID Varchar(10), Name Nvarchar(10))
Insert #TEST Values('01', N'小张')
Insert #TEST Values('01', N'小王')
Insert #TEST Values('02', N'小王')
Insert #TEST Values('02', N'小陈')
Insert #TEST Values('02', N'张三')
Insert #TEST Values('03', N'李四')
Insert #TEST Values('03', N'王武')


select id,(select name+',' from #TEST where id=t.id for xml path(''))
from #TEST t group by id
/*
id
---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
01 小张,小王,
02 小王,小陈,张三,
03 李四,王武,

(3 行受影响)

*/
百年树人 2010-10-11
  • 打赏
  • 举报
回复
select id,
name=stuff((select ','+name from #test where id=t.id for xml path('')),1,1,'')
from #test t
group by id

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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