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 @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')这条语句我不能理解,谁能帮忙解释一下,为什么第二行要'[]'这两个符号,set @sql = '[' + @sql + ']'又是什么意思,如何定义的@sql
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 @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')这条语句我不能理解,谁能帮忙解释一下,为什么第二行要'[]'这两个符号,set @sql = '[' + @sql + ']'又是什么意思,如何定义的@sql
一般列这样写 没说必须要
如:
create table tb([ID] int)
print @sqlset @sql = '[' + @sql + ']'
print @sql看看不就明白了
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
set @sql = '[' + @sql + ']'
print 'select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b'
看
谢谢,可是还是有一点,select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程这句话,为什么@sql=需要一个isnull函数呢?如果没有这个函数为什么不可以呢?
select 课程 from tb group by 课程 的第一行,即 @sql = '数学'
2. 第二次 isnull(@sql + '],[' , '') 已经有值了,@sql先加上 '],[' 再加上select 课程 from tb group by 课程 的第一行的第二行,此时@sql = '数学],[物理'
3. 第三次 和第二次差不多,只是改为加上select 课程 from tb group by 课程 的第一行的第三行,此时@sql = '数学],[物理],[语文'
....一直连接到的最后一行select 课程 from tb group by 课程 。
4.set @sql = '[' + @sql + ']'
将收尾个加'[',']' 这时候@sql = '[数学],[物理],[语文]'