刚刚学习SQL有很多不明白的地方
在网上看到这样一个事例,但是有很多地方不理解,请朋友们帮着讲解一下:假设有张学生成绩表(CJ)如下
Name    Subject     Result
张三    语文        80
张三    数学        90
张三    物理        85
李四    语文        85
李四    数学        92
李四    物理        82想变成    
姓名   语文   数学   物理
张三   80     90     85
李四   85     92     82执行代码如下:
declare @sql varchar(4000)
set @sql = 'select Name'
select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result  end) ['+Subject+']'
from (select distinct Subject from CJ) as a
select @sql = @sql+' from CJ group by name'
exec(@sql)
有些地方看不懂,能不能详细讲解一下这个执行语句.谢谢了

解决方案 »

  1.   

    declare @sql varchar(4000)--声明变量
    set @sql = 'select Name'--变量赋值
    ---(移出)
    select @sql = @sql+' from CJ group by name'--变量赋值(串连接)
    exec(@sql)--执行动态语句
    ----
    select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result  end) ['+Subject+']'
    from (select distinct Subject from CJ) as a--可分解为下面两句
    select Subject,Subject from (select distinct Subject from CJ) as a
    select @sql = @sql +'字串'
    ---即每行数据会将查询结果串接到@sql变量中
    --再用print(@sql)打印出结果就更明白了
      

  2.   

    你用PRINT @sql
    打印出来就一目了然了!
      

  3.   

    print @sql 打印出来看看就明白了.
      

  4.   

    declare @sql varchar(4000)
    set @sql = 'select Name'
    select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result  end) ['+Subject+']'
    from
     --(select distinct Subject from chengji) as a(这句可以直接用tablename代替效果一样)
    tablename
    select @sql = @sql+' from chengji group by name'
    print @sql
    exec(@sql)
      

  5.   

    楼上的朋友,像你这么说,可以运行,但是运行出来的结果有重复的
    你的运行结果是姓名   语文   数学   物理  语文   数学   物理
    张三   80     90     85    80     90     85
    李四   85     92     82    85     92     82 我还有点不明白的地方
    select @sql = @sql+' from CJ group by name'--变量赋值(串连接)
    -------------------------------------------------------------
    from cj group by name被单引号扩了起来,就说明它是字符串了,应该直接把' from CJ group by name'这个串连接到@sql的后面啊,而不是语文,数学,物理什么的.本人初学,有可能问的问题让人笑话,希望各位朋友帮帮忙,谢谢了!
    sum函数的作用是什么呢?
      

  6.   

    我只知道sum()是求和的
    但是在这个例子里,sum()是用来干什么的?
      

  7.   

    明明可以用SELECT建一个临时表插入再UPDATE的,搞那么麻烦
      

  8.   

    有重复加一个DISTINCT关键字就OK了
      

  9.   

    declare @sql varchar(4000)
    set @sql = 'select Name'
    select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result  end) ['+Subject+']'
    from CJ group by Subject--这样也可
    select @sql = @sql+' from CJ group by name'
    exec(@sql)