通过方法构造出前面的语句
declare @aa varchar(5000)
set @aa='select ...case ....end from ... '
......exec(@aa)

解决方案 »

  1.   

    declare @sql varchar(5000)
    set @sql='select * from (SELECT 姓名,'declare  cursor1 cursor for select 科目 from 表 group by 科目
    declare
    @i varchar(100)
    open cursor1
    fetch cursor1 into @i
    while @@fetch_status=0
    begin
      set @sql=@sql+'SUM(CASE 科目 WHEN '+@i+' THEN 分数 ELSE 0 END) '+@i+' '
      fetch cursor1 into @i
    end
    close cursor1
    deallocate cursor1set @sql=@sql+' FROM 表 GROUP BY 姓名) AA'exec(@sql)
      

  2.   

    create table mytable (姓名 char(10),科目 char(10),分数 numeric(6,2))
    insert into mytable values('A','数学',    10)
    insert into mytable values('A','语文',    20)
    insert into mytable values('A','历史',    30)
    insert into mytable values('B','化学',    40)
    insert into mytable values('B','数学',    50)
    insert into mytable values('B','历史',    60)
    insert into mytable values('C','历史',    70)
    insert into mytable values('D','英语',    80)
    insert into mytable values('D','数学',    90)
    insert into mytable values('E','体育',    88.8)
    insert into mytable values('F','政治',    100)
    go
    -------------------------------------------------------------------------
    declare @sql varchar(8000)
    set @sql = 'select 姓名,'select @sql = @sql + 'sum(case 科目 when '''+科目+''' 
                              then 分数 else 0 end) as '''+科目+''','
      from (select distinct 科目 from mytable) as aselect @sql = left(@sql,len(@sql)-1) + ' from mytable group by 姓名'exec(@sql)
    go
    -------------------------------------------------------------------------
    以下是结果姓名            化学    历史     数学     体育    英语    语文    政治
    A          .00 30.00 10.00 .00 .00 20.00 .00
    B          40.00 60.00 50.00 .00 .00 .00 .00
    C          .00 70.00 .00 .00 .00 .00 .00
    D          .00 .00 90.00 .00 80.00 .00 .00
    E          .00 .00 .00 88.80 .00 .00 .00
    F          .00 .00 .00 .00 .00 .00 100.00
      

  3.   

    create table mytable (姓名 char(10),科目 char(10),分数 numeric(6,2))
    insert into mytable values('A','数学',    10)
    insert into mytable values('A','语文',    20)
    insert into mytable values('A','历史',    30)
    insert into mytable values('B','化学',    40)
    insert into mytable values('B','数学',    50)
    insert into mytable values('B','历史',    60)
    insert into mytable values('C','历史',    70)
    insert into mytable values('D','英语',    80)
    insert into mytable values('D','数学',    90)
    insert into mytable values('E','体育',    88.8)
    insert into mytable values('F','政治',    100)
    go
    -------------------------------------------------------------------------
    declare @sql varchar(8000)
    set @sql = 'select 姓名,'select @sql = @sql + 'sum(case 科目 when '''+科目+''' 
                              then 分数 else 0 end) as '''+科目+''','
      from (select distinct 科目 from mytable) as aselect @sql = left(@sql,len(@sql)-1) + ' from mytable group by 姓名'exec(@sql)
    go
    -------------------------------------------------------------------------
    以下是结果姓名            化学    历史     数学     体育    英语    语文    政治
    A          .00 30.00 10.00 .00 .00 20.00 .00
    B          40.00 60.00 50.00 .00 .00 .00 .00
    C          .00 70.00 .00 .00 .00 .00 .00
    D          .00 .00 90.00 .00 80.00 .00 .00
    E          .00 .00 .00 88.80 .00 .00 .00
    F          .00 .00 .00 .00 .00 .00 100.00
      

  4.   

    create table mytable (姓名 char(10),科目 char(10),分数 numeric(6,2))
    insert into mytable values('A','数学',    10)
    insert into mytable values('A','语文',    20)
    insert into mytable values('A','历史',    30)
    insert into mytable values('B','化学',    40)
    insert into mytable values('B','数学',    50)
    insert into mytable values('B','历史',    60)
    insert into mytable values('C','历史',    70)
    insert into mytable values('D','英语',    80)
    insert into mytable values('D','数学',    90)
    insert into mytable values('E','体育',    88.8)
    insert into mytable values('F','政治',    100)
    go
    -------------------------------------------------------------------------
    declare @sql varchar(8000)
    set @sql = 'select 姓名,'select @sql = @sql + 'sum(case 科目 when '''+科目+''' 
                              then 分数 else 0 end) as '''+科目+''','
      from (select distinct 科目 from mytable) as aselect @sql = left(@sql,len(@sql)-1) + ' from mytable group by 姓名'exec(@sql)
    go
    -------------------------------------------------------------------------
    以下是结果姓名            化学    历史     数学     体育    英语    语文    政治
    A          .00 30.00 10.00 .00 .00 20.00 .00
    B          40.00 60.00 50.00 .00 .00 .00 .00
    C          .00 70.00 .00 .00 .00 .00 .00
    D          .00 .00 90.00 .00 80.00 .00 .00
    E          .00 .00 .00 88.80 .00 .00 .00
    F          .00 .00 .00 .00 .00 .00 100.00