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