如何用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 行)
*/
学习到的内容: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 行)
*/
相关文章推荐
- PHP如何获取刚插入数据的ID 和判断SQL语句是否成功执行
- 如何用sql语句查询和删除表中重复数据
- 在Transact-SQL语句中如何用常量来表示二进制形式的数据?
- sql 中如何将A表的数据更新到B表中,数据表备份语句
- 如何用sql语句修改数据表中字段,实现identity(100,1)
- 两张表关联如何实现同时插入数据 sql具体语句
- 如何往有自增标识字段的表插入数据时,同时给自增标识字段插入值呢,在Inset Into语句前后加上SQL语句:SET IDENTITY_INSERT TableName ON和SET IDENTITY_INSERT TableName OFF
- SQL语句oracle中如何插入Date类型的数据
- 如何用SQL语句查询Excel数据?
- 如何用SQL语句查询Excel数据?
- 【SQL】如何一次(一条SQL语句)向ORACLE中插入多组/多条数据,不同于mysql
- 如何写随机从表中抽一条数据的SQL语句
- 实现跨多个表格的数据进行组合的SQL语句 (2)
- 在Oracle使用sql语句中如何插入日期格式的数据
- sqlserver中,如何把一列中的多行数据在一行显示
- SQL语句如何输出两次相同的数据但是字段不一样
- 如何用SQL语句查询Excel数据?
- SQL语句oracle中如何插入Date类型的数据
- 【SQL心得】:在含有GROUP BY的SELECT语句中如何显示COUNT()为0的结果
- 在Oracle使用sql语句中如何插入日期格式的数据