SQL把几行数据显示到一行上

wanglinxi 2010-10-14 02:09:02
如下描述:

字段

数据一
数据二
数据三

我想要的结果:

字段

数据一\数据二\数据三


就是把几行的数据显示在一行上。。。。
...全文
275 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
DBA_磊仔 2012-09-23
静态写成动态只是拼凑问题,没有写出动态的语句是因为两者转换非常容易,这里给出的只是思路,此类变换无需遍历、临时表之类的东西
[Quote=引用 11 楼 的回复:]
引用 9 楼 的回复:
你这个写死了的,不灵活啊。
个人观点 要实现这个不能用简单的sql语句解决。只能用存储过程或函数来解决,可能需要遍历、中途可能需要临时表![/Quote]
回复
jilonglv 2012-09-23
[Quote=引用 9 楼 的回复:]

SQL code

--构建测试数据
create table #TB(房号 int, 床号 int, 姓名 varchar(10))
insert into #TB select 201, 0, '张三'
union all select 201, 1, '张四'
union all select 201, 2, '张五'
union all select 202, 0, '张六'
unio……
[/Quote]
你这个写死了的,不灵活啊。
个人观点 要实现这个不能用简单的sql语句解决。只能用存储过程或函数来解决,可能需要遍历、中途可能需要临时表!
回复
楼上几位正解!
回复
DBA_磊仔 2012-09-23

--构建测试数据
create table #TB(房号 int, 床号 int, 姓名 varchar(10))
insert into #TB select 201, 0, '张三'
union all select 201, 1, '张四'
union all select 201, 2, '张五'
union all select 202, 0, '张六'
union all select 202, 1, '张七'
union all select 202, 2, '张八'
--效果一解决方案
select 房号,0 as 床号,[0] as 姓名, 1 as 床号, [1] as 姓名 , 2 as 床号,[2] as 姓名
from #TB pivot (max(姓名)for 床号 in ([0],[1],[2]))p
/*
房号 床号 姓名 床号 姓名 床号 姓名
----------- ----------- ---------- ----------- ---------- ----------- ----------
201 0 张三 1 张四 2 张五
202 0 张六 1 张七 2 张八

(2 行受影响)
*/
--效果二解决方案
select 房号,[0] as 床号0,[1] as 床号1,[2] as 床号2 from #TB pivot (max(姓名)for 床号 in ([0],[1],[2]) )p
/*
房号 床号0 床号1 床号2
----------- ---------- ---------- ----------
201 张三 张四 张五
202 张六 张七 张八

(2 行受影响)
*/


回复
silverpearlx 2012-09-21
这个不错,我也是建议用UDF,之前我也是类似这样做的
[Quote=引用 5 楼 的回复:]

引用 4 楼 happycell188 的回复:
SQL code
--SQL Server 2000
create function dbo.f_str()
returns varchar(100)
as
begin
declare @str varchar(100)
select @str=isnull(@str+'\','')+rtrim(字段) from tb
end
……
[/Quote]
回复
zhugaoping 2012-09-21
SQL目前查出的结果是:
房号 床号 姓名
201 0 张三
201 1 张四
201 2 张五
202 0 张六
202 1 张七
202 2 张八
希望查出的结果是:
房号 床号 姓名 床号 姓名 床号 姓名
201 0 张三 1 张四 2 张五
202 0 张六 1 张七 2 张八

请各位大师帮帮忙,谢谢!
回复
喜-喜 2010-10-14
[Quote=引用 4 楼 happycell188 的回复:]
SQL code
--SQL Server 2000
create function dbo.f_str()
returns varchar(100)
as
begin
declare @str varchar(100)
select @str=isnull(@str+'\','')+rtrim(字段) from tb
end
go

select 字段=dbo.f_str(……
[/Quote]
--SQL Server 2000
create function dbo.f_str()
returns varchar(100)
as
begin
declare @str varchar(100)
select @str=isnull(@str+'\','')+rtrim(字段) from tb
return @str --少了return,呵呵..
end
go

select 字段=dbo.f_str() from tb

回复
喜-喜 2010-10-14
--SQL Server 2000
create function dbo.f_str()
returns varchar(100)
as
begin
declare @str varchar(100)
select @str=isnull(@str+'\','')+rtrim(字段) from tb
end
go

select 字段=dbo.f_str() from tb
回复
喜-喜 2010-10-14
--SQL Server 2005
select 字段=stuff((select '\'+rtrim(字段) from tb for xml path('')),1,1,'') from tb
回复
王向飞 2010-10-14

--> 数据库版本:
--> Microsoft SQL Server 2008 (RTM) - 10.0.1600.22
--> 测试数据:[TB]
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[TB]')
AND type in (N'U'))
DROP TABLE [TB]
GO

---->建表
create table [TB]([name] varchar(4),[status] varchar(8))
insert [TB]
select '小张','普通员工' union all
select '小张','组长' union all
select '小二','经理' union all
select '小三','老板' union all
select '小三','员工'
GO


SELECT a.name,
status =stuff((
select ','+convert(varchar(20),status) FROM [TB] WHERE name = a.name for xml path(''))
,1,1,'')
FROM [TB] a
group by a.name

SELECT a.name,
status =STUFF(REPLACE(REPLACE(
(select status
FROM [TB]
where name = a.name
FOR XML AUTO
), '<TB status="', ','), '"/>', ''), 1, 1, '')
FROM [TB] a
group by a.name
--> 查询结果
SELECT * FROM [TB]
--> 删除表格
--DROP TABLE [TB]

回复
SQLCenter 2010-10-14
串起来还是分字段?
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2010-10-14 02:09
社区公告
暂无公告