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

时间:2022-07-18 15:04:44
如下描述:

字段

数据一
数据二
数据三

我想要的结果:

字段

数据一\数据二\数据三


就是把几行的数据显示在一行上。。。。

12 个解决方案

#1


串起来还是分字段?

#2



--> 数据库版本:
--> 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]

#3


--SQL Server 2005
select 字段=stuff((select '\'+rtrim(字段) from tb for xml path('')),1,1,'') from tb

#4


--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

#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
go

select 字段=dbo.f_str(……

--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

#6


SQL目前查出的结果是:
房号 床号 姓名
201 0 张三
201 1 张四
201 2 张五
202 0 张六
202 1 张七
202 2 张八
希望查出的结果是:
房号 床号 姓名 床号 姓名 床号 姓名
201 0 张三 1 张四 2 张五
202 0 张六 1 张七 2 张八

请各位大师帮帮忙,谢谢!

#7


该回复于2012-09-21 16:42:38被版主删除

#8


这个不错,我也是建议用UDF,之前我也是类似这样做的
引用 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
……

#9



--构建测试数据
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 行受影响)
*/


#10


楼上几位正解!

#11


引用 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……

你这个写死了的,不灵活啊。
    个人观点  要实现这个不能用简单的sql语句解决。只能用存储过程或函数来解决,可能需要遍历、中途可能需要临时表!

#12


静态写成动态只是拼凑问题,没有写出动态的语句是因为两者转换非常容易,这里给出的只是思路,此类变换无需遍历、临时表之类的东西
引用 11 楼  的回复:
引用 9 楼 的回复:
你这个写死了的,不灵活啊。
  个人观点 要实现这个不能用简单的sql语句解决。只能用存储过程或函数来解决,可能需要遍历、中途可能需要临时表!

#1


串起来还是分字段?

#2



--> 数据库版本:
--> 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]

#3


--SQL Server 2005
select 字段=stuff((select '\'+rtrim(字段) from tb for xml path('')),1,1,'') from tb

#4


--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

#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
go

select 字段=dbo.f_str(……

--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

#6


SQL目前查出的结果是:
房号 床号 姓名
201 0 张三
201 1 张四
201 2 张五
202 0 张六
202 1 张七
202 2 张八
希望查出的结果是:
房号 床号 姓名 床号 姓名 床号 姓名
201 0 张三 1 张四 2 张五
202 0 张六 1 张七 2 张八

请各位大师帮帮忙,谢谢!

#7


该回复于2012-09-21 16:42:38被版主删除

#8


这个不错,我也是建议用UDF,之前我也是类似这样做的
引用 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
……

#9



--构建测试数据
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 行受影响)
*/


#10


楼上几位正解!

#11


引用 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……

你这个写死了的,不灵活啊。
    个人观点  要实现这个不能用简单的sql语句解决。只能用存储过程或函数来解决,可能需要遍历、中途可能需要临时表!

#12


静态写成动态只是拼凑问题,没有写出动态的语句是因为两者转换非常容易,这里给出的只是思路,此类变换无需遍历、临时表之类的东西
引用 11 楼  的回复:
引用 9 楼 的回复:
你这个写死了的,不灵活啊。
  个人观点 要实现这个不能用简单的sql语句解决。只能用存储过程或函数来解决,可能需要遍历、中途可能需要临时表!