您的位置:首页 > 数据库

如何用SQL语句把同一列的数据按某个group by语句组合成一行数据

2010-12-13 23:00 399 查看
    刚才从论坛上面看到一个帖子,我之前也碰到过这一类问题,所以记下来,算学习到新的东西。从回答者给出的不同的代码,也从另一个侧面看到了这个问题的多种思维解决方案。还是有不少东西可以学得到的。

    学习到的内容:stuff函数的应用

问题: 

  有一个用户表(姓名,编号,爱好)
  user(name,id,hobby),
里面的数据有:
  张三 001 篮球
  张三 001 电影
  李四 002 足球
  王五 003 上网
  李四 002 看美女
现在要求写一SQL语句,使查出结果为:
  张三 001 篮球,电影
  李四 002 足球,看美女
  王五 003 上网

 

解决方案:

方案一:

SQL code
IF OBJECT_ID('USER') IS NOT NULL DROP TABLE [USER]
GO
CREATE TABLE [USER](
NAME VARCHAR(10)
,ID VARCHAR(5)
,HOBBY VARCHAR(10)
)
INSERT INTO [USER]
SELECT '张三','001','篮球' UNION ALL
SELECT '张三','001','电影' UNION ALL
SELECT '李四','002','足球' UNION ALL
SELECT '王五','003','上网' UNION ALL
SELECT '李四','002','看美女'

SELECT NAME,ID
,STUFF((SELECT ','+HOBBY FROM [USER] T2 WHERE T2.NAME=T1.NAME FOR XML PATH('')),1,1,'')
FROM [USER] T1
GROUP BY NAME,ID
/*
NAME ID
---------- ----- ---------------
李四 002 足球,看美女
王五 003 上网
张三 001 篮球,电影
*/

方案二:SQL code 

--SQL2000

--1. 创建处理函数
create table tb(name varchar(10),ID int,hobby varchar(20))
insert into tb
select '张三','001','篮球'
union all
select '张三','001','电影'
union all
select '李四','002','足球'
union all
select '王五','003','上网'
union all
select '李四','002','看美女'

go

CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + hobby FROM tb WHERE id=@id
RETURN STUFF(@r, 1, 1, '')
END
GO

-- 调用函数
SELECt name, hobby = dbo.f_str(id) FROM tb GROUP BY name,id

drop table tb
drop function dbo.f_str
/*

(所影响的行数为 5 行)

name hobby
李四 足球,看美女
王五 上网
张三 篮球,电影

(所影响的行数为 3 行)

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息