sql行转列的问题

q18341994676 2016-12-12 10:38:39
类别 数量 金额
A1 1 10
A2 2 12
A3 3 13
把上面的表转换成下面的格式怎么写
A1 数量 A1金额 A2数量 A2金额 A3数量 A3金额
1 10 2 12 3 13
要动态的这个只是打个比方因为类别还有很多
...全文
132 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
q18341994676 2016-12-13
  • 打赏
  • 举报
回复
@卖水果的net A1_N A1_M A2_N A2_M A3_N A3_M N_合计 m _合计 1 10 2 11 3 12 6 33 要这种效果的
q18341994676 2016-12-12
  • 打赏
  • 举报
回复
谢谢你的帮助大神
卖水果的net 2016-12-12
  • 打赏
  • 举报
回复

create table test(type varchar(10), n int, m int)
go
insert into test values('A1', 1, 10),('A2', 2, 12),('A3', 3, 13)
go
declare @sql varchar(2000)
set @sql = 'select '
select @sql = @sql + 
   +'sum(case when type = ''' + type + ''' then n else 0 end) As ' + type + '_n,'
   +'sum(case when type = ''' + type + ''' then m else 0 end) As ' + type + '_m,' 
from test ; 
set @sql = substring(@sql,1,len(@sql)-1) + ' from test'
exec (@sql)

go
drop table test 
go


(3 行受影响)
A1_n        A1_m        A2_n        A2_m        A3_n        A3_m
----------- ----------- ----------- ----------- ----------- -----------
1           10          2           12          3           13

(1 行受影响)


q18341994676 2016-12-12
  • 打赏
  • 举报
回复
不要沉啊大神们求助啊
卖水果的net 2016-12-12
  • 打赏
  • 举报
回复
贴表结构和测试数据,用 insert 形式的;
q18341994676 2016-12-12
  • 打赏
  • 举报
回复
@卖水果的net 我又加了几列数据,因为真是数据有重复的不能删除的
q18341994676 2016-12-12
  • 打赏
  • 举报
回复
@卖水果的net
得到的结果是这样的按照你的出错
卖水果的net 2016-12-12
  • 打赏
  • 举报
回复
select @sql = @sql + 
   +'sum(case when type = ''' + type + ''' then n else 0 end) As ' + type + '_n,'
   +'sum(case when type = ''' + type + ''' then m else 0 end) As ' + type + '_m,' 
from (
select distinct type test ) x ;
q18341994676 2016-12-12
  • 打赏
  • 举报
回复
@卖水果的net 在正式的存储过程里面查询得到的很多相同的列,就是很多比方说这里的a1_n和a1_m有很多列,distinct不好使
卖水果的net 2016-12-12
  • 打赏
  • 举报
回复

create table test(type varchar(10), n int, m int)
go
insert into test values('A1', 1, 10),('A2', 2, 12),('A3', 3, 13)
go
-- 创建存储过程
create proc sp_data
as 
declare @sql varchar(2000)
set @sql = 'select '
select @sql = @sql + 
   +'sum(case when type = ''' + type + ''' then n else 0 end) As ' + type + '_n,'
   +'sum(case when type = ''' + type + ''' then m else 0 end) As ' + type + '_m,' 
from test ; 
set @sql = substring(@sql,1,len(@sql)-1) + ' from test'
exec (@sql)
go
-- 执行他
exec sp_data
go
drop proc sp_data
go
drop table test 
go

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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