邹老大休息了,我来给你搞定
declare @sql varchar(8000)
set @sql = 'select 学号'
select @sql = @sql + ',sum(case 科目 when '''+科目+''' then 成绩 end) ['+科目+']'
 from (select distinct 科目 from aaa) as a
select @sql = @sql+' from aaa group by 学号,班级'
print(@sql)
exec(@sql)

解决方案 »

  1.   

    如果想传个表名做变量,这样
    create  procedure  sp(@table  varchar(800))
    as 
    begin
      declare @sql varchar(8000)
      set @sql = 'select 学号'
      select @sql = @sql + ',sum(case 科目 when '''+科目+''' then 成绩 end) ['+科目   +']'
       from (select distinct 科目 from '+@table+') as a
      select @sql = @sql+' from '+@table+' group by 学号,班级'
      print(@sql)
      exec(@sql)
    end
      

  2.   

    alter   procedure   sp_re(@table varchar(500),@class varchar(80))
    as 
    begin
      declare @excSql varchar(8000)
      set @excSql = 'select 学号,班级'
      select @excSql='select @sql=@sql+'''+',sum(case  科目 when '''''''+'+科目+'+''''''''+'  then 成绩 end) ['''
      +'+科目+'''+']'''+ '  from (select  distinct  科目 from '+@Table 
      +') as  a  select  @sql=@sql+'''+'from '+@Table +' where 班级='''''''+'+'''+@class+'''+'+''''''' group by 学号,班级'''
      select  @excSql='declare @sql varchar(8000) '+' set @sql='''+'  select 学号,班级  '''+@excSql+' Exec(@sql)'
      exec(@excSql)
    end 在win2000下测试成功,加分吧,写了半天
      

  3.   

    不知道 hmily1688(刘涛--公司里面打杂的) 是怎么做的,我试了一下,表名用变量不能成功。这样做行不行select 学号,班级,sum(成绩)
    from score
    group by 学号,班级,科目
    order by 班级,科目,学号结果是这样:
    学号    班级  成绩 科目  
    821      软1   85   C语言 
    822      软1   81   C语言
    823      软1   91   C语言
    821      软1   95   DATABASE  
    822      软1   82   DATABASE  
    823      软1   92   DATABASE
    821      软1   80  DELPHI
    822      软1   83   DELPHI
    823      软1   93   DELPHI
      

  4.   

    交叉数据报表
    有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 PivotTable®、创建交叉数据报表或旋转数据。假定有一个表 Pivot,其中每季度占一行。对 Pivot 的 SELECT 操作在垂直方向上列出这些季度:Year      Quarter      Amount
    ----      -------      ------
    1990      1           1.1
    1990      2           1.2
    1990      3           1.3
    1990      4           1.4
    1991      1           2.1
    1991      2           2.2
    1991      3           2.3
    1991      4           2.4生成报表的表必须是这样的,其中每年占一行,每个季度的数值显示在一个单独的列中,如:Year
     Q1
     Q2
     Q3
     Q4
     
    1990
     1.1
     1.2
     1.3
     1.4
     
    1991
     2.1
     2.2
     2.3
     2.4
     
    下面的语句用于创建 Pivot 表并在其中填入第一个表中的数据:USE Northwind
    GOCREATE TABLE Pivot
    ( Year      SMALLINT,
      Quarter   TINYINT, 
      Amount      DECIMAL(2,1) )
    GO
    INSERT INTO Pivot VALUES (1990, 1, 1.1)
    INSERT INTO Pivot VALUES (1990, 2, 1.2)
    INSERT INTO Pivot VALUES (1990, 3, 1.3)
    INSERT INTO Pivot VALUES (1990, 4, 1.4)
    INSERT INTO Pivot VALUES (1991, 1, 2.1)
    INSERT INTO Pivot VALUES (1991, 2, 2.2)
    INSERT INTO Pivot VALUES (1991, 3, 2.3)
    INSERT INTO Pivot VALUES (1991, 4, 2.4)
    GO下面是用于创建旋转结果的 SELECT 语句:SELECT Year, 
        SUM(CASE Quarter WHEN 1 THEN Amount ELSE 0 END) AS Q1,
        SUM(CASE Quarter WHEN 2 THEN Amount ELSE 0 END) AS Q2,
        SUM(CASE Quarter WHEN 3 THEN Amount ELSE 0 END) AS Q3,
        SUM(CASE Quarter WHEN 4 THEN Amount ELSE 0 END) AS Q4
    FROM Northwind.dbo.Pivot
    GROUP BY Year
    GO该 SELECT 语句还处理其中每个季度占多行的表。GROUP BY 语句将 Pivot 中一年的所有行合并成一行输出。当执行分组操作时,SUM 聚合中的 CASE 函数的应用方式是这样的:将每季度的 Amount 值添加到结果集的适当列中,在其它季度的结果集列中添加 0。如果该 SELECT 语句的结果用作电子表格的输入,那么电子表格将很容易计算每年的合计。当从应用程序使用 SELECT 时,可能更易于增强 SELECT 语句来计算每年的合计。例如:SELECT P1.*, (P1.Q1 + P1.Q2 + P1.Q3 + P1.Q4) AS YearTotal
    FROM (SELECT Year,
                 SUM(CASE P.Quarter WHEN 1 THEN P.Amount ELSE 0 END) AS Q1,
                 SUM(CASE P.Quarter WHEN 2 THEN P.Amount ELSE 0 END) AS Q2,
                 SUM(CASE P.Quarter WHEN 3 THEN P.Amount ELSE 0 END) AS Q3,
                 SUM(CASE P.Quarter WHEN 4 THEN P.Amount ELSE 0 END) AS Q4
         FROM Pivot AS P
         GROUP BY P.Year) AS P1
    GO带有 CUBE 的 GROUP BY 和带有 ROLLUP 的 GROUP BY 都计算与本例显示相同的信息种类,但格式稍有不同。
      

  5.   

    其实楼主的问题就是
    把表的行与列互换,这个问题的写法多了,j888曾经写过一段,老衲也写过,
    现在楼主就是想把表名当变量传过去,用我的写法肯定能行的。不知道你为什么通过不了,我上面的alter改为create就行了,我在本机上做实验时写法没通过就在查询分析器中写了。
    其实楼上写法是只能针对固定的几行如1.2,3,4,5等,而邹大侠上面的
    proc p_qry
    @班级 varchar(10)
    as
    declare @s varchar(8000)
    set @s=''
    select @s=@s+',['+科目+']=sum(case 科目 when '''+科目+''' then 成绩 else 0 end)'
    from score where 班级=@班级
    group by 科目
    exec('select 学号,班级'+@s+' from score where 班级='''+@班级+''' group by 学号,班级')
    go
    已经不管多少行也是能行的,现在就是一个表名当变量的问题,如果楼主还不行可以把你的邮箱给我我把我写成的存储过程导成sql语句mail给你
      

  6.   

    邮件我已经给你发了,但我再把具体的结果也贴在这一下
    --创建score1
    select  821 as  学号,'软1' as 班级,'C语言' as 科目,85 as  成绩 
    into score   
    union  
    select  821 ,'软1','DATABASE',  95
    union
    select 821,'软1','DELPHI',   80
    union
    select 822,'软1','C语言',  81
    union 
    select 822,'软1','DATABASE',  82
    union 
    select 822,'软1','DELPHI',    83
    union 
    select  823,'软1','C语言', 91
    union 
    select 823,'软1','DATABASE',92
    union
    select 823,'软1','DELPHI', 93
    union 
    select  321,'网1','VFO', 85
    union
    select 321,'网1','操作工',70
    union
    select 321,'网1','C语言',84
    union
    select 321,'网1','网页', 97
    go  
    --创建score2
    select   * into  score2  from  score
    go 
    --创建存储过程 sp_re
    select * from score
    select * from score2
    go 
    create  procedure   sp_re(@table varchar(500),@class varchar(80))
    as 
    begin
      declare @excSql varchar(8000)
      set @excSql = 'select 学号,班级'
      select @excSql='select @sql=@sql+'''+',sum(case  科目 when '''''''+'+科目+'+''''''''+'  then 成绩 end) ['''
      +'+科目+'''+']'''+ '  from (select  distinct  科目 from '+@Table 
      +') as  a  select  @sql=@sql+'''+'from '+@Table +' where 班级='''''''+'+'''+@class+'''+'+''''''' group by 学号,班级'''
      select  @excSql='declare @sql varchar(8000) '+' set @sql='''+'  select 学号,班级  '''+@excSql+' Exec(@sql)'
      exec(@excSql)
    end 
    go 
    --测试存储过程
    exec  sp_re  'score','软1'
    exec sp_re 'score1','软1'
    --清空垃圾
    drop procedure  sp_re 
    drop table    score
    drop table  score2
    --不知道符合不符合你的要求
    --嘻嘻,哈哈,搞定了吧
      

  7.   

    NO GOOD
    结果不对,我已经把结果截图发到你的EMAIL去了,你去看看!!!!