create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go
--SQL SERVER 2005 动态SQL。
declare @sql2 varchar(8000)
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + '[' + 课程 + ']' from tb group by 课程
set @sql2= ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')
print @sql2
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')
select * FROM tb
有表如上,2005的写法。现在他查询出来的顺序就是 ----数学,物理,语文我估计他是按拼音头一个字母排序的, 那我现在对这个动态的语句如何定义自己的排序呢?
比方说我想 按 数学,语文,物理 排序这个动态的语句要怎么实现呢?请都用动态的方法,比方说我不知道课程下有多少种课程类型。
要怎么排序我的行转列后的字段顺序呢?
因为查询的时候经常会出现如分数大于80分后,只有物理和数学出现,
那无法知道行中具体有多少课程种类。或者查询名字时,有的人有科目没有考,那也无法
知道行中具体有多少课程种类
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go
--SQL SERVER 2005 动态SQL。
declare @sql2 varchar(8000)
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + '[' + 课程 + ']' from tb group by 课程
set @sql2= ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')
print @sql2
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')
select * FROM tb
有表如上,2005的写法。现在他查询出来的顺序就是 ----数学,物理,语文我估计他是按拼音头一个字母排序的, 那我现在对这个动态的语句如何定义自己的排序呢?
比方说我想 按 数学,语文,物理 排序这个动态的语句要怎么实现呢?请都用动态的方法,比方说我不知道课程下有多少种课程类型。
要怎么排序我的行转列后的字段顺序呢?
因为查询的时候经常会出现如分数大于80分后,只有物理和数学出现,
那无法知道行中具体有多少课程种类。或者查询名字时,有的人有科目没有考,那也无法
知道行中具体有多少课程种类
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go
--SQL SERVER 2005 动态SQL。
declare @sql2 varchar(8000)
declare @sql varchar(8000)
select 课程 into #tb
from tb group by 课程 order by CHARINDEX(课程,'数学物理语文')
select @sql = isnull(@sql + ',' , '') + '[' + 课程 + ']'
from #tb
drop table #tb
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b') /*
(3 行受影响)
姓名 数学 物理 语文
---------- ----------- ----------- -----------
李四 84 94 74
张三 83 93 74(2 行受影响)
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go
--SQL SERVER 2005 动态SQL。
declare @sql2 varchar(8000)
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + '[' + 课程 + ']' from tb group by 课程 order by CHARINDEX(课程,'数学物理语文') --排序方式
set @sql2= ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')
print @sql2
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')
select * FROM tb
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go drop table tb--SQL SERVER 2005 动态SQL。
declare @sql2 varchar(8000)
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + '[' + 课程 + ']' from (select top 100 percent *,Rank() over (order by CHARINDEX(课程,'数学语文物理')) row_num from tb) a group by 课程,row_num order by row_num
print @sql
set @sql2= ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')
print @sql2
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b') /*
姓名 数学 语文 物理
---------- ----------- ----------- -----------
李四 84 74 94
张三 83 74 93(2 行受影响)*/