Sql Sever记录的行列转换

本文介绍了如何通过SQL语句将表结构进行转换,并详细解释了数据插入、数据查询及数据分组等常见操作,包括使用CREATE TABLE语句创建表、使用INSERT INTO插入数据、使用GROUP BY进行数据分组等技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

已知一个表的结构为:
姓名 科目 成绩
张三 语文 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值