Sql Sever记录的行列转换

已知一个表的结构为:
姓名 科目 成绩
张三 语文 20
张三 数学 30
张三 英语 50
李四 语文 70
李四 数学 60
李四 英语 90

怎样通过select语句把他变成以下结构:
姓名 语文 数学 英语
张三 20 30 50
李四 70 60 90

 

 

答:


CREATE TABLE [dbo].[Stu] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[Name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[Class] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[score] [int] NOT NULL
) ON [PRIMARY]
GO

select * from Stu
insert into Stu values('马里','语文',80)
insert into Stu values('马里','数学',96)
insert into Stu values('付帅','语文',85)
insert into Stu values('付帅','数学',85)
insert into Stu values('唐子意','语文',30)
insert into Stu values('唐子意','数学',50)
insert into Stu values('王海辰','英语',35)


declare @sql nvarchar(4000)
set @sql=''
select @sql = @sql + ',sum(case class when '''+ class + ''' then score else 0 end) as ' +class from stu group by class

set @sql = 'select name '+@sql+' from stu group by name'
print @sql
exec(@sql)

 

 

(

可以试试这个:

declare @sql nvarchar(4000)
set @sql=''

select @sql = @sql + class from stu

print @sql

)

 

另一种:

--创建存储过程
create proc dbo.usp_data
as
--定义一个游标
DECLARE cur_class CURSOR
 FOR
--从stu表中获得所有的科目并且排序
SELECT distinct class from stu ORDER BY class
--打开游标
OPEN cur_class
--定义游标循环的行数
DECLARE @cursor_row INT
--定义循环过程中需要的获得的科目名称,用此变量保存
DECLARE @class nvarchar(100)
--设置游标的行数
SET @cursor_row = @@CURSOR_ROWS
--定义循环中需要拼接的字符串
declare @sql nvarchar(4000)
declare @insert_sql nvarchar(4000)
declare @case_sql nvarchar(4000)
declare @sum_sql nvarchar(4000)
--创建临时表的语句固定部分
set @sql = 'create table #temp (姓名 nvarchar(100),'
set @insert_sql = 'insert into #temp(姓名,'
set @case_sql = ''
set @sum_sql = ''
--print @cursor_row
--按照游标循环,即按科目循环
WHILE(@cursor_row > 0)
BEGIN
 SET @cursor_row = @cursor_row - 1
 FETCH NEXT
  FROM cur_class INTO @class
  --如果循环到最后一行,不需要添加逗号或者是分号
  if(@cursor_row = 0)
  begin
   set @sql = @sql + @class + ' int'
   set @insert_sql = @insert_sql + @class
   set @case_sql = @case_sql+ '(case class when '''+@class+''' then score else 0 end)'
   set @sum_sql = @sum_sql + 'sum('+@class+') as '+@class + '成绩 '
  end
  else
  begin
  set @sql = @sql + @class + ' int' + ','
  set @insert_sql = @insert_sql + @class + ','
  set @case_sql = @case_sql+ '(case class when '''+@class+''' then score else 0 end),'
  set @sum_sql = @sum_sql + 'sum('+@class+') as '+@class+ '成绩,'
  end
  --@insert_sql = @insert_sql + ''

END
--关闭游标
CLOSE cur_class
DEALLOCATE cur_class
--拼接符合条件的字符串
set @sql = @sql + '); '
set @insert_sql = @insert_sql + ')'
--+ 'select Name,'+ @case_sql + 'from stu;select * from #temp'
--exec(@sql + @insert_sql)
set @sql=@sql + @insert_sql +'select Name,'+ @case_sql + 'from stu;'
set @sum_sql = 'select 姓名,'+ @sum_sql+' from #temp group by 姓名; drop table #temp'
set @sql = @sql + @sum_sql
exec (@sql)

 

 

从以下一串字母中找出规律,并写出接下一个是什么?

OTTFFSSE

答:答案是N。

One Two Three Four Five Six Seven Eight Nine

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值