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

lamb218 2005-08-29 11:55:28
数据:
编码 用户数
01 100
02 120
03 160
04 320
合并后的效果应如下:
100 120 160 320
...全文
962 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hjksoft 2006-06-21
  • 打赏
  • 举报
回复
不知道如果其中一条记录中有NULL怎么办呢,好像无法生成结果出来
xueguang 2005-08-29
  • 打赏
  • 举报
回复
declare @a varchar(4000)
set @a=''
select @a=@a+' '+用户数 from 表
select stuff(@a,1,1,'')
jinjazz 2005-08-29
  • 打赏
  • 举报
回复
--建立测试环境
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 表
wgsasd311 2005-08-29
  • 打赏
  • 举报
回复
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)
lamb218 2005-08-29
  • 打赏
  • 举报
回复
非常谢谢各位!
不知道我如何给分了,就这么一点分,我都有点惭愧了!
jinjazz 2005-08-29
  • 打赏
  • 举报
回复
--建立测试环境
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 表
wgsasd311 2005-08-29
  • 打赏
  • 举报
回复
楼主误人不浅啊,下次要说清楚 ,按你要求改动如下:
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)
wgsasd311 2005-08-29
  • 打赏
  • 举报
回复
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)

lamb218 2005-08-29
  • 打赏
  • 举报
回复
地区 1.标准全球通 2.全球通资费套餐 3.全球通优惠
上面这一行是列名,不需要显示出来
lamb218 2005-08-29
  • 打赏
  • 举报
回复
我重新发一遍吧,估计我说的不够清楚。谢谢了!
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
wgsasd311 2005-08-29
  • 打赏
  • 举报
回复
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)
jinjazz 2005-08-29
  • 打赏
  • 举报
回复
--建立测试环境
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
xueguang 2005-08-29
  • 打赏
  • 举报
回复
--分成多列一楼的就可以,如果编码有重复,可以这样写
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)
jinjazz 2005-08-29
  • 打赏
  • 举报
回复
那你group by
wgsasd311 2005-08-29
  • 打赏
  • 举报
回复
楼主,你有没有看懂我代码,他实现的是一行多列,列数由编码个数动态确定。
lamb218 2005-08-29
  • 打赏
  • 举报
回复
你们实现的都是合并后一行一列,我要求把分成多列!
能实现吗?

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧