将sql表中的数据多行动态的转为多列

先把贴图贴上

 

这是表中的数据

 

(1)这是第一种效果,不知道能不能满足你的需求

 

(2)如果以上效果不满足,那你可能需要的是第二种了

 

好了,效果看过了,代码贴上

(1)这是第一种效果的代码

SELECT Name,
(SELECT Interest+'--' FROM Table_4   WHERE Name=A.Name   FOR XML PATH('')) AS List FROM Table_4 A
GROUP BY Name

 

(2)这是第二中效果的代码

declare @c int,@i int
declare @sql nvarchar(800)
declare @cur cursor
declare @Name nvarchar(50)
declare @Interest nvarchar(50)

 set @i=1
 set @c=( select top(1) C from (select COUNT(1) as C from Table_4 group by Name) as tb1 order by C desc)
 

--动态创建一张临时表
 set @sql = 'create table tmp(Name nvarchar(50) '
 while(@i<=@c)
 begin
  set @sql = @sql + ' ,Interest'+CAST(@i as varchar(2))+' nvarchar(50)'
  set @i = @i+1
 end
 set @sql =@sql+ ' ,num int )'
--print(@sql)
 exec(@sql)
 

--通过游标动态将多行转为多列
set @cur = cursor  for select Name,Interest from table_4
open @cur
fetch next from @cur into @Name,@Interest
while(@@FETCH_STATUS=0)
begin
 set @c = (select COUNT(1) from tmp where Name=@Name)
 if @c=0 --insert value
  begin
   insert into tmp(Name,Interest1,num) values(@Name,@Interest,1)
  end
 else
  begin
   set @i = (select num from tmp where Name=@Name)+1
   set @sql='update tmp set Interest'+cast(@i as varchar(10))+' = ^$^'+@Interest+'^$^ , num='+cast(@i as varchar(10))+' where Name=^$^'+@Name+'^$^'
   set @sql = (select replace(@sql,'^$^',''''))
   exec(@sql)
  end
 fetch next from @cur into @Name,@Interest
end
select * from tmp

 

 

实现的代码已经提供,下面是建表的脚本

--创建表
CREATE TABLE [dbo].[Table_4](
 [ID] [int] IDENTITY(1,1) NOT NULL,
 [Name] [nvarchar](50) NOT NULL,
 [Interest] [nvarchar](50) NOT NULL,
 [State] [int] NULL,
 CONSTRAINT [PK_Table_4] PRIMARY KEY CLUSTERED
(
 [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值