create table #(a varchar(100),c varchar(10) , b int)
insert # values('aa','english' , 11)
insert # values('bb','chinese' , 1)
insert # values('aa','chinese' , 45)
insert # values('cc','english' , 81)
insert # values('a','english' , 11)
insert # values('aay','chinese' , 561)
insert # values('a','chinese' , 14)select * from #declare @sql varchar(8000)
set @sql = 'select  c  , '
select @sql = @sql + 'sum(case a when '''+a+''' 
                          then b else 0 end) '+a +','
  from (select distinct a from #) as aselect @sql = left(@sql,len(@sql)-1) + ' from # group by c'print @sql
exec (@sql)
drop table #

解决方案 »

  1.   

    看這一個:
    create table #(name  varchar(100),subject  varchar(10) , score int)
    insert # values('張三','english' , 60)
    insert # values('李四','chinese' , 80)
    insert # values('張三','chinese' , 90)
    insert # values('李四','english' , 100)
    insert # values('王五','english' , 98)
    insert # values('肖六','chinese' , 80)
    insert # values('王五','chinese' , 75)select * from #declare @sql varchar(8000)
    set @sql = 'select  subject   , '
    select @sql = @sql + ' sum(case name when '''+name+''' 
                              then score  else 0 end) '+name +','
      from (select distinct name from #) as aselect @sql = left(@sql,len(@sql)-1) + ' from # group by subject'print @sql
    exec (@sql)
    drop table #
      

  2.   

    如果沒有那一欄的值則顯示空 , 則為create table #(name  varchar(100),subject  varchar(10) , score int)
    insert # values('張三','english' , 60)
    insert # values('李四','chinese' , 80)
    insert # values('張三','chinese' , 90)
    insert # values('李四','english' , 100)
    insert # values('王五','english' , 98)
    insert # values('肖六','chinese' , 80)
    insert # values('王五','chinese' , 75)select * from #declare @sql varchar(8000)
    set @sql = 'select  subject   , '
    select @sql = @sql + ' nullif(sum(case name when '''+name+''' 
                              then score  else 0 end) , 0) '+name +','
      from (select distinct name from #) as aselect @sql = left(@sql,len(@sql)-1) + ' from # group by subject'print @sql
    exec (@sql)
    drop table #
      

  3.   

    --示例--示例数据
    create table Score(Nameunion varchar(10),Subject varchar(10),Score varchar(10))
    insert Score select '张三','语文',65
    union all select '李四','数学',85
    union all select '张三','英语',78
    union all select '王二麻子','语文',75
    union all select '张三','物理',88
    go--查询的存储过程
    create proc p_qry
    @Nameunion varchar(4000)='',
    @Subject varchar(4000)=''
    as
    set nocount on
    declare @s varchar(8000),@s1 varchar(8000),@s2 varchar(8000)
    select @s='',
    @s1=''''+replace(@Nameunion,',',''',''')+'''',
    @s2=''''+replace(@Subject,',',''',''')+''''
    select @s=@s+',['+rtrim(Nameunion)+']=max(case Nameunion when '''
    +rtrim(Nameunion)+''' then Score else '''' end)'
    from Score
    where @s1=''''''
    or charindex(','''+Nameunion+''',',','+@s1+',')>0
    group by Nameunion
    if @s1>'''''' set @s1='Nameunion in('+@s1+')' else set @s1='1=1'
    if @s2>'''''' set @s2='Subject in('+@s2+')' else set @s2='1=1'
    exec('select Subject'+@s+'
    from Score
    where ('+@s1+') and ('+@s2+')
    group by Subject')
    go--调用
    exec p_qry 
    exec p_qry '张三,李四'
    exec p_qry '张三,李四','语文,数学'
    exec p_qry '','语文,数学'
    go--删除测试
    drop table Score
    drop proc p_qry/*--结果
    Subject    李四         王二麻子       张三         
    ---------- ---------- ---------- ---------- 
    数学         85                    
    物理                               88
    英语                               78
    语文                    75         65Subject    李四         张三         
    ---------- ---------- ---------- 
    数学         85         
    物理                    88
    英语                    78
    语文                    65Subject    李四         张三         
    ---------- ---------- ---------- 
    数学         85         
    语文                    65Subject    李四         王二麻子       张三         
    ---------- ---------- ---------- ---------- 
    数学         85                    
    语文                    75         65
    --*/
      

  4.   

    非常感谢各位,感谢 xhwly(wly) 和 邹建,我又学到一手,在此之前我还不知道 Select 命令还可以这样用,能够把一个表的字段值累加!CSDN真是高手如云,藏龙卧虎呀!
    以前我在处理行列转换问题时,都是先把它们分解成一个一个的表,然后用Full Outer Join连接生成。