我有一个表是
Name  Sex  类别       类别值
张三   男   身份证号  328368679089817
张三   男   毕业证号  B00886
张三   男   毕业学校  人民大学
张三   男   所在单位  工业公司
.
.
.
想把这个表变成
Name   Sex     身份证号        毕业证号  毕业学校  所在单位 .....
张三   男    328368679089817   B00886  人民大学  工业公司
不知道如何弄,请高手指点,多谢了

解决方案 »

  1.   

    这上问题问的多
    给你个例子 你看一下
    create table t(name varchar(03),subject varchar(10), int)
    insert into t
    select 'A','語文',80 union all
    select 'A','數學',80 union all
    select 'A','外語',80 union all
    select 'B','數學',80 union all
    select 'B','外語',80 union all
    select 'C','語文',78--在使用动态变量的时候 不能使用动态的表
    --答案一
    declare @sql varchar(8000),@count int
    select @count=count(distinct subject) from T
    set @sql='select name'
    select @sql=@sql+',sum(case when subject='''+subject+''' then  else 0 end) as '+subject
    from T
    group by subjectselect @sql=@sql+',sum(isnull(,0))/'+rtrim(@count)+' as [avg]  from t group by name'
    exec(@sql)
    /*
    name 外語          語文          數學          avg         
    ---- ----------- ----------- ----------- ----------- 
    A    80          80          80          80
    B    80          0           80          53
    C    0           78          0           26
    */
    drop table t
    --答案二
    create table tb(name varchar(10),subject varchar(10), int)insert into tb values('A',         '语文',      80)
    insert into tb values('A',         '数学',      80)
    insert into tb values('A',         '外语',      80 )
    insert into tb values('B',         '数学',      80)
    insert into tb values('B',         '外语',      80)
    insert into tb values('C',         '语文',      78)select name ,
      max(case subject when '语文' then  else 0 end) '语文',
      max(case subject when '数学' then  else 0 end) '数学',
      max(case subject when '外语' then  else 0 end) '外语',
      sum()/(select max(cnt) cnt from (select name , count(*) cnt from tb group by name) t) [avg]
    from tb
    group by namedeclare @sql varchar(8000)
    set @sql = 'select Name as ' + '姓名'
    select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then  else 0 end) [' + Subject + ']'
    from (select distinct Subject from tb) as a
    set @sql = @sql + ' ,sum()/(select max(cnt) cnt from (select name , count(*) cnt from tb group by name) t) [avg] from tb group by name'
    exec(@sql) drop table tb
      

  2.   

    declare @sql varchar(8000)
    set @sql='select name,sex' 
    select @sql=@sql+',['+类别
    +']=(case 类别 when '''+类别+''' then 类别值 else '' end)'
    from(select distinct 类别 from tb) a
    exec(@sql+' from tb group by name,sex')
      

  3.   

    create table tab(name varchar(10),sex varchar(4),类别 varchar(20),类别值 varchar(30))
    insert tab
    select '张三','男','身份证号','328368679089817' union all
    select '张三','男','毕业证号','B00886' union all
    select '张三','男','毕业学校','人民大学' union all
    select '张三','男','所在单位','工业公司'
    declare @sql varchar(8000) 
    set @sql= 'select name,max(sex) as sex '  
    select @sql=@sql+ ',[ '+类别 
    + ']=max(case 类别 when  '''+类别+ ''' then 类别值 else  '''' end) ' 
    from (select distinct 类别 from tab) a 
    exec(@sql+ ' from tab group by name ')
    drop table tab
      

  4.   

    name       sex   毕业学校                           毕业证号                           身份证号                           所在单位
    ---------- ---- ------------------------------ ------------------------------ ------------------------------ ------------------------------
    张三         男    人民大学                           B00886                         328368679089817                工业公司(1 行受影响)
      

  5.   

    Declare @sql Varchar(8000)
    Set @sql=''
    Select @sql=@sql+',Max(Case When 类别='''+类别+''' Then 类别值 Else '''' End) As ['+类别+']' 
    From T Group By 类别
    Exec('Select Name,Sex'+@sql+'From T Group By Name,Sex')
      

  6.   

    以V2※高捷的例子做说明:
    1.首先要提出要显示的内容:也就是将 毕业学校  毕业证号   身份证号 所在单位 这些列用语句的方式显示出来,语句为:
    select @sql=@sql+ ',[ '+类别 
    + ']=max(case 类别 when  '''+类别+ ''' then 类别值 else  '''' end) ' 
    from (select distinct 类别 from tab) a 2.与上面的语句结合生成结果:
    set @sql= 'select name,max(sex) as sex '  
    select @sql=@sql+ ',[ '+类别 
    + ']=max(case 类别 when  '''+类别+ ''' then 类别值 else  '''' end) ' 
    from (select distinct 类别 from tab) a 
    exec(@sql+ ' from tab group by name ')