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

解决方案 »

  1.   

    这个主要是规范写法 一般用关键字做字段 必须加上[]如 user 否则报错
    一般列这样写 没说必须要
    如:
    create table tb([ID] int)
      

  2.   

    declare @sql varchar(8000)select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
    print @sqlset @sql = '[' + @sql + ']'
    print @sql看看不就明白了
      

  3.   

    declare @sql varchar(8000)
    select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
    set @sql = '[' + @sql + ']'
    print 'select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b'

      

  4.   


    谢谢,可是还是有一点,select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程这句话,为什么@sql=需要一个isnull函数呢?如果没有这个函数为什么不可以呢?
      

  5.   

    1. 第一次 isnull(@sql + '],[' , '')  由于@sql未赋值是NULL所以 @sql = '' 然后再加上
    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 = '[数学],[物理],[语文]'
      

  6.   

     这是一个很好的技巧,如果没有isnull函数而有没有对@sql,那么@sql就是NULL 再加上任何值都还是NULL。
      

  7.   

    这个是个技巧,一开始不给@sql赋值,第一次@sql+'],[' 就是null值,这样第一次得出来的值就是第2个参数的值。。多看看就知道就会明白