假设有张学生成绩表(CJ)如下
Name    Subject     Result
张三    语文        80
张三    数学        90
张三    物理        85
李四    语文        85
李四    数学        92
李四    物理        82想变成    
姓名   语文   数学   物理
张三   80     90     85
李四   85     92     82----------将下列代码改成在查询器里执行的sql语句------------
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.   

    select @sql
    改成
    set @sql
      

  2.   

    shaohaiou() ( ) 信誉:100    Blog   加为好友  2007-04-26 11:37:11  得分: 0  
     
     
       select @sql
    改成
    set @sql
      
     ---------------------改了没用,麻烦哪位建个表,测一下好不好?
    谁搞定给一半分给他!
      

  3.   

    --这个将就用一下吧
    select Name, 
    sum(case subject when '语文' then result end) as '语文', 
    sum(case subject when '数学' then result end) as '数学', 
    sum(case subject when '物理' then result end) as '物理'
    from CJ
    group by name
      

  4.   

    create table t(name varchar(10),Subject varchar(10),Result int)
    insert into t select '张三' ,   '语文'     ,   80 union all
    select '张三'  ,  '数学' ,       90 union all
    select '张三'  ,  '物理'  ,      85  union all
    select '李四'  ,  '语文'   ,     85 union all
    select '李四'  ,  '数学'  ,      92 union all
    select '李四'  ,  '物理'  ,      82DECLARE @sql VARCHAR(8000)
    SET @sql='SELECT name'
    SELECT @sql=@sql+',['+Subject+']=MAX(CASE Subject WHEN '''+Subject+''' THEN Result ELSE 0 END)' FROM t GROUP BY Subject
    EXEC(@sql+' FROM t GROUP BY name')
    drop table t
      

  5.   

    结果
    -------------------------------
    name 数学 物理  语文
    李四 92   82 85
    张三 90   85 80
      

  6.   

    zhaozhao110(我死了,在烈火中我又站起来了,你猜是涅盘,还是尸变) ( ) 信誉:100    Blog   加为好友  2007-04-26 13 
    ----------------
    你的确实是可行的,但是如果把Result改成字符串类型怎么办呢?
    还有你的max适用不了result为空的数据,
      

  7.   

    create table t(name varchar(10),Subject varchar(10),Result varchar(10))
    insert into t select '张三' ,   '语文'     ,   80 union all
    select '张三'  ,  '数学' ,       90 union all
    select '张三'  ,  '物理'  ,      85  union all
    select '李四'  ,  '语文'   ,     85 union all
    select '李四'  ,  '数学'  ,      92 
    insert into t([name],subject) values('李四'  ,  '物理')
    DECLARE @sql VARCHAR(8000)
    SET @sql='SELECT name'
    SELECT @sql=@sql+',['+Subject+']=MAX(CASE Subject WHEN '''+Subject+''' THEN Result ELSE 0 END)' FROM t GROUP BY Subject
    EXEC(@sql+' FROM t GROUP BY name')
    drop table t
      

  8.   

    怎么不行,完全可以.
    name 数学 物理  语文
    李四 92   0 85
    张三 90   85 80
      

  9.   

    zhaozhao110(我死了,在烈火中我又站起来了,你猜是涅盘,还是尸变) ( ) 信誉:100    Blog   加为好友  2007-04-26 16:16:29  得分: 0  
     
     
       怎么不行,完全可以.
    name 数学 物理  语文
    李四 92   0 85
    张三 90   85 80
      
    ---------------
    对,就是这样!
    只是,如果我加了一条记录:
    张三,化学,88,
    这样的话,好像“化学”查不出来。
    能不能帮忙优化一下?我看不懂那段sql
      

  10.   

    可以啊.
    insert into t([name],subject,Result) values('张三','化学','88')
    -------------------------------------
    name  化学       数学 物理   语文
    李四  0    92  0 85
    张三  88    90  85 80
      

  11.   

    我运行的怎么没有“化学”出来呢?name      数学 物理   语文
    李四     92    0     85
    张三     90    85     80
      

  12.   

    zhaozhao110(我死了,在烈火中我又站起来了,你猜是涅盘,还是尸变) ( ) 信誉:100    Blog   加为好友  2007-04-26 16:42:24  得分: 0  
     
     
       可以啊.
    insert into t([name],subject,Result) values('张三','化学','88')
    -------------------------------------
    name  化学       数学 物理   语文
    李四  0    92  0 85
    张三  88    90  85 80
      
     
    ---------------
    是我把记录看错了,你的是正确的,谢谢!
      

  13.   

    可是你能解释一下:SET @sql='SELECT name'
    SELECT @sql=@sql+',['+Subject+']=MAX(CASE Subject WHEN '''+Subject+''' THEN Result ELSE 0 END)' FROM t GROUP BY Subject这三行代码吗?
      

  14.   

    你把字符串打出来就清楚了.
    SELECT name,[化学]=MAX(CASE Subject WHEN '化学' THEN Result ELSE 0 END),[数学]=MAX(CASE Subject WHEN '数学' THEN Result ELSE 0 END),[物理]=MAX(CASE Subject WHEN '物理' THEN Result ELSE 0 END),[语文]=MAX(CASE Subject WHEN '语文' THEN Result ELSE 0 END)
      

  15.   

    zhaozhao110(我死了,在烈火中我又站起来了,你猜是涅盘,还是尸变) ( ) 信誉:100    Blog   加为好友  2007-04-26 17:23:34  得分: 0  
     
     
       你把字符串打出来就清楚了.
    SELECT name,[化学]=MAX(CASE Subject WHEN '化学' THEN Result ELSE 0 END),[数学]=MAX(CASE Subject WHEN '数学' THEN Result ELSE 0 END),[物理]=MAX(CASE Subject WHEN '物理' THEN Result ELSE 0 END),[语文]=MAX(CASE Subject WHEN '语文' THEN Result ELSE 0 END)
     
    -------------还是不适合我的需求,等会开个100分的贴子给你!如果我把Result成绩字段改成 "字符串"就不行了,
    而我的需求是:result字段的内容不光是数字,也可能有字符串!
     
      

  16.   

    zhaozhao110(我死了,在烈火中我又站起来了,你猜是涅盘,还是尸变) ( ) 信誉:100    Blog   加为好友  2007-04-26 17:33:00  得分: 0  
     
     
       谁搞定给一半分给他!
    -----------------------------
    LZ真小气,一半才十分,呵呵.
      
    ---------------不会啦,会开贴给你100的。这样吧,可能我的问题简单地用该sql是搞不定的,我上传一张图片,你看一下就明白了。见图:
    http://images13.51.com/13/a/76/6d/mgao0118/638_627_cbc34d183230332b.jpg另外,还有三个过滤条件:Show all properties  
    Show only shared properties  
    Show only difference我想你会明白的。
      

  17.   

    我已经搞定了,用一个sql搞不定,只有用逻辑转换的方法了。
    zhaozhao110(我死了,在烈火中我又站起来了,你猜是涅盘,还是尸变?) ( ) 信誉:100    Blog   加为好友 
    ------------
    我另外个贴子,给你100分,表示感谢!