如何将多行数据合并成一行多列

时间:2023-01-25 15:05:30
数据:
  编码 用户数
   01   100
   02   120
   03   160
   04   320
合并后的效果应如下:
   100 120 160 320

16 个解决方案

#1


declare @sql varchar(4000)
set @sql=''
select @sql=@sql+',['+ 编码+']=sum(case  编码 when '+ 编码+' then 用户数 else 0 end) from tbl'
set @sql='select '+right(@sql,len(@sql)-1)+ ' from tbl'
exec(@sql)

#2


--建立测试环境
Create Table 表(编码 varchar(10),用户数 varchar(10))
--插入数据
insert into 表
select '01','100' union
select '02','120' union
select '03','160' union
select '04','320'
declare @str varchar(8000)
--测试语句
 set @str=''
 select @str=@str+用户数+' ' from 表
 print @str

/*--输出
100 120 160 320 
--*/
 
--删除测试环境
Drop Table 表

#3


declare @a varchar(4000)
    set @a=''
    select @a=@a+' '+用户数 from 表
    select stuff(@a,1,1,'')

#4


你们实现的都是合并后一行一列,我要求把分成多列!
能实现吗?

#5


楼主,你有没有看懂我代码,他实现的是一行多列,列数由编码个数动态确定。

#6


那你group by

#7


--分成多列一楼的就可以,如果编码有重复,可以这样写
declare @sql varchar(4000)
set @sql=''
select @sql=@sql+',['+ 编码+']=sum(case  编码 when '+ 编码+' then 用户数 else 0 end)'  from (select distinct 编码 from 表) A
set @sql='select '+right(@sql,len(@sql)-1)+ ' from 表'
exec(@sql)

#8


--建立测试环境
Create Table 表(id varchar(10),amount integer,remark varchar(10))
--插入数据
insert into 表
select '1','3','aaa' union
select '1','5','bbb' union
select '1','4','ccc' union
select '2','10','pkoge' union
select '2','12','daf'
go
--测试语句
CREATE FUNCTION FunMergeCharField(@vchA varchar(10))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r=''
SELECT @r=@r+','+remark FROM 表 WHERE id=@vchA 
RETURN(substring(@r,2,8000))
END
GO
select id,sum(amount) as sum,dbo.FunMergeCharField(id) as remark叠加 from 表 group by id
 
--删除测试环境
Drop Table 表
Drop FUNCTION FunMergeCharField

#9


jinjazz(近身剪(充电中...)) ---thanks .
改正如下:
declare @sql varchar(4000)
set @sql=''
select @sql=@sql+',['+ 编码+']=sum(case  编码 when '+ 编码+' then 用户数 else 0 end) from tbl'
set @sql='select '+right(@sql,len(@sql)-1)+ ' from tbl group by '
exec(@sql)

#10


我重新发一遍吧,估计我说的不够清楚。谢谢了!
1长春 1.标准全球通 234
1长春 2.全球通资费套餐 5423
1长春 3.全球通优惠 454
2吉林 1.标准全球通 297
2吉林 2.全球通资费套餐 12
2吉林 3.全球通优惠 29949

要生成的报表要是这样的:

地区  1.标准全球通  2.全球通资费套餐  3.全球通优惠
长春  234           5423              454
吉林  297           12                29949

#11


地区  1.标准全球通  2.全球通资费套餐  3.全球通优惠
上面这一行是列名,不需要显示出来

#12


jinjazz(近身剪(充电中...)) ---不需要加group by ,应加distinct才对。
代码如下:
declare @sql varchar(4000)
set @sql=''
select @sql=@sql+',['+ 编码+']=sum(case  编码 when '+ 编码+' then 用户数 else 0 end) from tbl'
set @sql='select distinct '+right(@sql,len(@sql)-1)+ ' from tbl  '
exec(@sql)

#13


楼主误人不浅啊,下次要说清楚 ,按你要求改动如下:
declare @sql varchar(4000)
set @sql=''
select @sql=@sql+',['+ 编码+']=sum(case  编码 when '+ 编码+' then 用户数 else 0 end) from tbl'
set @sql='select 地区 '+right(@sql,len(@sql)-1)+ ' from tbl group by 地区 '
exec(@sql)

#14


--建立测试环境
Create Table 表(区域 varchar(100),类型 varchar(100),价格 varchar(100))
--插入数据
insert into 表
select '1长春','1.标准全球通','234' union
select '1长春','2.全球通资费套餐','5423' union
select '1长春','3.全球通优惠','454' union
select '2吉林','1.标准全球通','297' union
select '2吉林','2.全球通资费套餐','12' union
select '2吉林','3.全球通优惠','29949'

--测试语句
 DECLARE @SQL VARCHAR(8000)
SET @SQL='SELECT 区域'
SELECT @SQL= @SQL+ 
',min(CASE WHEN 类型 = ''' + 类型 + ''' THEN 价格  END) [' + 类型 + ']'
FROM (SELECT DISTINCT 类型 FROM 表) A
SET @SQL=@SQL+' FROM 表 GROUP BY 区域'
exec (@SQL)
 
 
--删除测试环境
Drop Table 表

#15


非常谢谢各位!
不知道我如何给分了,就这么一点分,我都有点惭愧了!

#16


不知道如果其中一条记录中有NULL怎么办呢,好像无法生成结果出来

#1


declare @sql varchar(4000)
set @sql=''
select @sql=@sql+',['+ 编码+']=sum(case  编码 when '+ 编码+' then 用户数 else 0 end) from tbl'
set @sql='select '+right(@sql,len(@sql)-1)+ ' from tbl'
exec(@sql)

#2


--建立测试环境
Create Table 表(编码 varchar(10),用户数 varchar(10))
--插入数据
insert into 表
select '01','100' union
select '02','120' union
select '03','160' union
select '04','320'
declare @str varchar(8000)
--测试语句
 set @str=''
 select @str=@str+用户数+' ' from 表
 print @str

/*--输出
100 120 160 320 
--*/
 
--删除测试环境
Drop Table 表

#3


declare @a varchar(4000)
    set @a=''
    select @a=@a+' '+用户数 from 表
    select stuff(@a,1,1,'')

#4


你们实现的都是合并后一行一列,我要求把分成多列!
能实现吗?

#5


楼主,你有没有看懂我代码,他实现的是一行多列,列数由编码个数动态确定。

#6


那你group by

#7


--分成多列一楼的就可以,如果编码有重复,可以这样写
declare @sql varchar(4000)
set @sql=''
select @sql=@sql+',['+ 编码+']=sum(case  编码 when '+ 编码+' then 用户数 else 0 end)'  from (select distinct 编码 from 表) A
set @sql='select '+right(@sql,len(@sql)-1)+ ' from 表'
exec(@sql)

#8


--建立测试环境
Create Table 表(id varchar(10),amount integer,remark varchar(10))
--插入数据
insert into 表
select '1','3','aaa' union
select '1','5','bbb' union
select '1','4','ccc' union
select '2','10','pkoge' union
select '2','12','daf'
go
--测试语句
CREATE FUNCTION FunMergeCharField(@vchA varchar(10))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r=''
SELECT @r=@r+','+remark FROM 表 WHERE id=@vchA 
RETURN(substring(@r,2,8000))
END
GO
select id,sum(amount) as sum,dbo.FunMergeCharField(id) as remark叠加 from 表 group by id
 
--删除测试环境
Drop Table 表
Drop FUNCTION FunMergeCharField

#9


jinjazz(近身剪(充电中...)) ---thanks .
改正如下:
declare @sql varchar(4000)
set @sql=''
select @sql=@sql+',['+ 编码+']=sum(case  编码 when '+ 编码+' then 用户数 else 0 end) from tbl'
set @sql='select '+right(@sql,len(@sql)-1)+ ' from tbl group by '
exec(@sql)

#10


我重新发一遍吧,估计我说的不够清楚。谢谢了!
1长春 1.标准全球通 234
1长春 2.全球通资费套餐 5423
1长春 3.全球通优惠 454
2吉林 1.标准全球通 297
2吉林 2.全球通资费套餐 12
2吉林 3.全球通优惠 29949

要生成的报表要是这样的:

地区  1.标准全球通  2.全球通资费套餐  3.全球通优惠
长春  234           5423              454
吉林  297           12                29949

#11


地区  1.标准全球通  2.全球通资费套餐  3.全球通优惠
上面这一行是列名,不需要显示出来

#12


jinjazz(近身剪(充电中...)) ---不需要加group by ,应加distinct才对。
代码如下:
declare @sql varchar(4000)
set @sql=''
select @sql=@sql+',['+ 编码+']=sum(case  编码 when '+ 编码+' then 用户数 else 0 end) from tbl'
set @sql='select distinct '+right(@sql,len(@sql)-1)+ ' from tbl  '
exec(@sql)

#13


楼主误人不浅啊,下次要说清楚 ,按你要求改动如下:
declare @sql varchar(4000)
set @sql=''
select @sql=@sql+',['+ 编码+']=sum(case  编码 when '+ 编码+' then 用户数 else 0 end) from tbl'
set @sql='select 地区 '+right(@sql,len(@sql)-1)+ ' from tbl group by 地区 '
exec(@sql)

#14


--建立测试环境
Create Table 表(区域 varchar(100),类型 varchar(100),价格 varchar(100))
--插入数据
insert into 表
select '1长春','1.标准全球通','234' union
select '1长春','2.全球通资费套餐','5423' union
select '1长春','3.全球通优惠','454' union
select '2吉林','1.标准全球通','297' union
select '2吉林','2.全球通资费套餐','12' union
select '2吉林','3.全球通优惠','29949'

--测试语句
 DECLARE @SQL VARCHAR(8000)
SET @SQL='SELECT 区域'
SELECT @SQL= @SQL+ 
',min(CASE WHEN 类型 = ''' + 类型 + ''' THEN 价格  END) [' + 类型 + ']'
FROM (SELECT DISTINCT 类型 FROM 表) A
SET @SQL=@SQL+' FROM 表 GROUP BY 区域'
exec (@SQL)
 
 
--删除测试环境
Drop Table 表

#15


非常谢谢各位!
不知道我如何给分了,就这么一点分,我都有点惭愧了!

#16


不知道如果其中一条记录中有NULL怎么办呢,好像无法生成结果出来