查询时如何将多行数据合到一行里去?

时间:2021-03-02 15:04:34
select zj_cl.che_h ,zj_dw.dw_name from zj_cl,zj_dw where zj_cl.dw_bh=zj_dw.dw_bh  and zj_dw.dw_bh='00!005'


烟台市人民检察院 G鲁F00310
烟台市人民检察院 G鲁F06006
烟台市人民检察院 G鲁F06008
烟台市人民检察院 G鲁F06009
烟台市人民检察院 G鲁F08218
烟台市人民检察院 G鲁F13669

要显示成这样:

烟台市人民检察院  G鲁F00310  G鲁F06006 G鲁F06008 G鲁F06009 G鲁F08218 G鲁F13669 

????

5 个解决方案

#1


行转列?
字符串汇总成一个字段?

#2


查询时如何将多行数据合到一行里去? 

select 字段1+''+字段2+''+字段3..........
from tablename

#3


--生成测试数据
create table T(Depart varchar(20),C_Number varchar(20))
insert into T select '烟台市人民检察院','G鲁F00310'
insert into T select '烟台市人民检察院','G鲁F06006'
insert into T select '烟台市人民检察院','G鲁F06008'
insert into T select '烟台市人民检察院','G鲁F06009'
insert into T select '烟台市人民检察院','G鲁F08218'
insert into T select '烟台市人民检察院','G鲁F13669'
Go

--执行处理过程
declare @s varchar(8000),@i varchar(10)
select top 1 @s='',@i=count(*)
from T group by Depart order by count(*) desc
while @i>0
select @s=',[C_Number'+@i+']=max(case when id='+@i
+' then C_Number else '''' end)+@s
,@i=@i-1
exec('
select Depart,C_Number,id=0 into #t from T order by Depart
declare @i int,@Depart varchar(10)
update #t set @i=case when @Depart=Depart then @i+1 else 1 end,id=@i,@Depart=Depart
select Depart'+@s+' from #t group by Depart')
go

--输出结果
/*
烟台市人民检察院 G鲁F00310 G鲁F06006 G鲁F06008 G鲁F06009 G鲁F08218 G鲁F13669
*/

--删除测试数据
drop table T

#4


增加一个冗余列就可以实现了 不过这个是有缺陷的 因为无法知道你要的表要多少列

#5


--行列转换示例

--测试数据
create table 表([11] varchar(2),[22] int,[33] int,[44] int,[55] int)
insert 表 select 'aa',1,2,3,6 
union all select 'bb',0,1,3,5 
union all select 'cc',1,2,3,6
union all select 'dd',1,2,3,6
union all select 'ee',1,2,3,6
go

--查询处理
declare @s1 varchar(8000),@s2 varchar(8000)
,@s3 varchar(8000),@s4 varchar(8000),@s5 varchar(8000)
,@i varchar(10)
select @s1='',@s2='',@s3='',@s4='',@s5='',@i='0'
select @s1=@s1+',@'+@i+' varchar(8000)'
,@s2=@s2+',@'+@i+'='''''
,@s3=@s3+'
select @'+@i+'=@'+@i+'+'',[''+[11]+'']=''+cast(['+name+'] as varchar) from 表'
,@s4=@s4+',@'+@i+'=''select ''+substring(@'+@i+',2,8000)'
,@s5=@s5+'+'' union all ''+@'+@i
,@i=cast(@i as int)+1
from syscolumns 
where object_id('表')=id and colid<>1

select @s1=substring(@s1,2,8000)
,@s2=substring(@s2,2,8000)
,@s4=substring(@s4,2,8000)
,@s5=substring(@s5,16,8000)

exec('declare '+@s1+'
select '+@s2+@s3+'
select '+@s4+'
exec('+@s5+')')
go

--删除测试表
drop table 表

/*--测试结果
aa          bb          cc          dd          ee          
----------- ----------- ----------- ----------- ----------- 
1           0           1           1           1
2           1           2           2           2
3           3           3           3           3
6           5           6           6           6

(所影响的行数为 4 行)
--*/

#1


行转列?
字符串汇总成一个字段?

#2


查询时如何将多行数据合到一行里去? 

select 字段1+''+字段2+''+字段3..........
from tablename

#3


--生成测试数据
create table T(Depart varchar(20),C_Number varchar(20))
insert into T select '烟台市人民检察院','G鲁F00310'
insert into T select '烟台市人民检察院','G鲁F06006'
insert into T select '烟台市人民检察院','G鲁F06008'
insert into T select '烟台市人民检察院','G鲁F06009'
insert into T select '烟台市人民检察院','G鲁F08218'
insert into T select '烟台市人民检察院','G鲁F13669'
Go

--执行处理过程
declare @s varchar(8000),@i varchar(10)
select top 1 @s='',@i=count(*)
from T group by Depart order by count(*) desc
while @i>0
select @s=',[C_Number'+@i+']=max(case when id='+@i
+' then C_Number else '''' end)+@s
,@i=@i-1
exec('
select Depart,C_Number,id=0 into #t from T order by Depart
declare @i int,@Depart varchar(10)
update #t set @i=case when @Depart=Depart then @i+1 else 1 end,id=@i,@Depart=Depart
select Depart'+@s+' from #t group by Depart')
go

--输出结果
/*
烟台市人民检察院 G鲁F00310 G鲁F06006 G鲁F06008 G鲁F06009 G鲁F08218 G鲁F13669
*/

--删除测试数据
drop table T

#4


增加一个冗余列就可以实现了 不过这个是有缺陷的 因为无法知道你要的表要多少列

#5


--行列转换示例

--测试数据
create table 表([11] varchar(2),[22] int,[33] int,[44] int,[55] int)
insert 表 select 'aa',1,2,3,6 
union all select 'bb',0,1,3,5 
union all select 'cc',1,2,3,6
union all select 'dd',1,2,3,6
union all select 'ee',1,2,3,6
go

--查询处理
declare @s1 varchar(8000),@s2 varchar(8000)
,@s3 varchar(8000),@s4 varchar(8000),@s5 varchar(8000)
,@i varchar(10)
select @s1='',@s2='',@s3='',@s4='',@s5='',@i='0'
select @s1=@s1+',@'+@i+' varchar(8000)'
,@s2=@s2+',@'+@i+'='''''
,@s3=@s3+'
select @'+@i+'=@'+@i+'+'',[''+[11]+'']=''+cast(['+name+'] as varchar) from 表'
,@s4=@s4+',@'+@i+'=''select ''+substring(@'+@i+',2,8000)'
,@s5=@s5+'+'' union all ''+@'+@i
,@i=cast(@i as int)+1
from syscolumns 
where object_id('表')=id and colid<>1

select @s1=substring(@s1,2,8000)
,@s2=substring(@s2,2,8000)
,@s4=substring(@s4,2,8000)
,@s5=substring(@s5,16,8000)

exec('declare '+@s1+'
select '+@s2+@s3+'
select '+@s4+'
exec('+@s5+')')
go

--删除测试表
drop table 表

/*--测试结果
aa          bb          cc          dd          ee          
----------- ----------- ----------- ----------- ----------- 
1           0           1           1           1
2           1           2           2           2
3           3           3           3           3
6           5           6           6           6

(所影响的行数为 4 行)
--*/