假设有张学生成绩表(tb_rowtocol)如下
Name Subject Result
张三 语文  73
张三 数学  83
张三 物理  93
李四 语文  74
李四 数学  84
李四 物理  94想变成 
姓名 语文 数学 物理
张三 73  83  93
李四 74  84  94declare @sql varchar(4000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
from (select distinct Subject from rowtocol) as a
set @sql = @sql + ' from rowtocol group by name'
exec(@sql) 
下面那段存储过程,我是怎么都看不懂,特别是when '''这怎么会有三个‘,第一句@sql为什么不能放下来?哪位帮我详细解释一下,最好每句都说一下,100分都给他!

解决方案 »

  1.   

    declare @sql varchar(4000) --定义查询字符
    set @sql = 'select Name as ' + '姓名' --先赋值‘姓名’字段
    select @sql = @sql + ' , sum(case Subject when '''
    +Subject+''' then Result end) ['+Subject+']'
    from (select distinct Subject from rowtocol) as a --循环把课程都找出来做表头
    set @sql = @sql + ' from rowtocol group by name' --加上查询的表
    exec(@sql)  --执行查询
      

  2.   

    CREATE TABLE #A(NAME VARCHAR(10),
    SUBJECT VARCHAR(10),
    RESULT INT
    )INSERT INTO #A
    SELECT '张三','语文',73 UNION
    SELECT '张三','数学',83 UNION
    SELECT '张三','物理',93 UNION
    SELECT '李四','语文',74 UNION
    SELECT '李四','数学',84 UNION
    SELECT '李四','物理',94
    DECLARE @SQL VARCHAR(4000)
    SET @SQL = 'SELECT NAME AS ' + '姓名'
    SELECT @SQL = @SQL + ' , SUM(CASE SUBJECT WHEN '''+SUBJECT+''' THEN RESULT END) ['+SUBJECT+']'
    FROM (SELECT DISTINCT SUBJECT FROM #A) AS A
    SET @SQL = @SQL + ' FROM #A GROUP BY NAME'PRINT @SQL
    EXEC(@SQL)
      

  3.   

    这是动态SQL的结果
    --------------------
    SELECT NAME AS 姓名 , 
    SUM(CASE SUBJECT WHEN '数学' THEN RESULT END) [数学] , 
    SUM(CASE SUBJECT WHEN '物理' THEN RESULT END) [物理] , 
    SUM(CASE SUBJECT WHEN '语文' THEN RESULT END) [语文] 
    FROM #A GROUP BY NAME
      

  4.   

    1、在字符串中,需要用一对"'"表示一个单引号。2、动态SQL语句拼接字符串而已,有点基础的人,用print @sql看看输出的语句就明白了。
      

  5.   

    这是动态的SQL语句,要执行一循环,所以不能放下来。
    三个引号:这是在字符串中引用变量,比如你要在字符串中引用字符的话要加上两个引号。
      

  6.   

    when '''这怎么会有三个‘,这里  中间那个表示被引用的意思!
      

  7.   

    其实你看一下PRINT @SQL这个结果就都知道了
      

  8.   

    declare @sql varchar(4000) --定义查询字符
    set @sql = 'select Name as ' + '姓名' --先赋值‘姓名’字段
    select @sql = @sql + ' , sum(case Subject when '''
    +Subject+''' then Result end) ['+Subject+']'
    from (select distinct Subject from rowtocol) as a --循环把课程都找出来做表头
    set @sql = @sql + ' from rowtocol group by name' --加上查询的表
    exec(@sql)  --执行查询