比如我数据库里的数据是:序号   姓名   年龄  
1     高米   24
2     吴号   32
3     长江   19如何通过SQL查询得到:米高   吴号   长江
 1     2     3
24    32    19

解决方案 »

  1.   

    create table ta(序号 int,姓名 varchar(10),年龄 int)
    insert ta select 1           ,'高米',       24 
    insert ta select 2           ,'吴号',       32 
    insert ta select 3           ,'长江',       19godeclare @s varchar(8000),@s1 varchar(8000)
    set @s = ''
    set @s1 = ''
    select @s = @s + ',['+ 姓名+']=max(case when 姓名= '''+姓名+''' then 年龄 else null end)',@s1 = @s1 + ',['+ 姓名+']=max(case when 姓名= '''+姓名+''' then 序号 else null end)'
    from (select distinct 姓名 from ta) a
    set  @s = 'select '+ stuff(@s,1,1,'') + ' from ta union select '
    set @s1 = stuff(@s1,1,1,'') + ' from ta'
    exec(@s + @s1)drop table ta/*长江          高米          吴号          
    ----------- ----------- ----------- 
    3           1           2
    19          24          32*/
      

  2.   


    create table ta(序号 int,姓名 varchar(10),年龄 int)
    insert ta select 1           ,'高米',       24 
    insert ta select 2           ,'吴号',       32 
    insert ta select 3           ,'长江',       19goselect * from (select 姓名,年龄 from ta) a
    pivot
    (
    max(年龄)
    for 姓名 in
    ([高米],[吴号],[长江])
    ) as ta今天刚学会的新技巧
    据说2005才能用
      

  3.   


    create table ta(序号 int,姓名 varchar(10),年龄 int)
    insert ta select 1           ,'高米',       24 
    insert ta select 2           ,'吴号',       32 
    insert ta select 3           ,'长江',       19
    goselect * from (select 姓名,序号 from ta) a
    pivot(max(序号) for 姓名 in ([高米],[吴号],[长江])) as ta
    union all
    select * from (select 姓名,年龄 from ta) a
    pivot(max(年龄) for 姓名 in ([高米],[吴号],[长江])) as tadrop table ta没看见那个序号  补充以下
      

  4.   

    drop table ta
    create table ta(id int,name varchar(10),age int)
    insert ta select 1           ,'高米',       24 
    insert ta select 2           ,'吴号',       32 
    insert ta select 3           ,'长江',       19go
    select max(高米) as '高米',max(吴号)as '吴号',max(长江)as '长江' from (select  case when name='高米' then cast(age as varchar(4)) else '' end    as '高米'  ,
          case  when  name='吴号' then cast(age as varchar(4)) else '' end  as '吴号',      
          case  when  name='长江' then cast(age as varchar(4)) else '' end as '长江' from ta) b
    union all
    select max(高米),max(吴号),max(长江) from (select  case when name='高米' then cast(id as varchar(4)) else '' end    as '高米'  ,
          case  when  name='吴号' then cast(id as varchar(4)) else '' end  as '吴号',      
          case  when  name='长江' then cast(id as varchar(4)) else '' end as '长江' from ta) b
      

  5.   


    create table ta(序号 int,姓名 varchar(10),年龄 int)
    insert ta select 1           ,'高米',       24 
    insert ta select 2           ,'吴号',       32 
    insert ta select 3           ,'长江',       19goselect max(case when 姓名='高米' then 序号 end) as 高米,
    max(case when 姓名='吴号' then 序号 end) as  吴号,
    max(case when 姓名='长江' then 序号 end) as 长江
    from ta
    union all
    select max(case when 姓名='高米' then 年龄 end) as 高米,
    max(case when 姓名='吴号' then 年龄 end) as  吴号,
    max(case when 姓名='长江' then 年龄 end) as 长江
    from ta/*
    高米          吴号          长江
    ----------- ----------- -----------
    1           2           3
    24          32          19
    警告: 聚合或其他 SET 操作消除了空值。(2 行受影响)
    */
      

  6.   

    pivot----SQL SERVER 2000 似乎不支持select max(case when 姓名='高米' then 序号 end) as 高米,
    max(case when 姓名='吴号' then 序号 end) as  吴号,
    max(case when 姓名='长江' then 序号 end) as 长江
    from ta
    union all
    select max(case when 姓名='高米' then 年龄 end) as 高米,
    max(case when 姓名='吴号' then 年龄 end) as  吴号,
    max(case when 姓名='长江' then 年龄 end) as 长江
    from ta
    -----这种方法太复杂了,如果记录还有很多,那肯定不行我想要的功能是将整个记录集倒过来显示,这个只是个举例。我记得以前有用过什么方法实现的,但是现在忘了。
      

  7.   

    create table ta(序号 int,姓名 varchar(10),年龄 int)
    insert ta select 1           ,'高米',       24 
    insert ta select 2           ,'吴号',       32 
    insert ta select 3           ,'长江',       19godeclare @sql1 varchar(4000),@sql2 varchar(4000)
    set @sql1='select 0'
    select @sql1=@sql1+',['+姓名+']=sum(case 姓名 when '''+姓名+''' then 序号 else '' '' end)' from (select 姓名 as 姓名 from ta )a
    set @sql1='select '+substring(@sql1,10,len(@sql1))+' from ta'set @sql2='select 0'
    select @sql2=@sql2+',['+姓名+']=sum(case 姓名 when '''+姓名+''' then 年龄 else '' '' end)' from (select 姓名 as 姓名 from ta )a
    set @sql2='select '+substring(@sql2,10,len(@sql2))+' from ta'exec(@sql1+' union all '+@sql2)