表1:
id    属性   
1     姓名
2     年龄
3     学校
表2
id     属性id     内容     记录id
1        1        刘德华     A
2        2         30       A
3        3         清华      A
4        1         张三      B
5        2         20       B
6        3         北大      B这是我从excel导入过来的,所以就这样设计了,因为字段不固定,表1会有很多字段,现在我想查询结果为
姓名   年龄   学校
刘德华  30    清华
张三    20     北大记录id是我记录同一个属性的,是惟一的,数据sqlserver   跪求DBA高手,100分,我就这么多分了!

解决方案 »

  1.   

    select * from (select 表1.属性,表2.内容,表2.记录id from 表1,表2 where 表1.id=表2.属性id) a pivot (max(内容) for 属性 in (姓名,年龄,学校)) b
      

  2.   


    CREATE TABLE 表1 
    ( id  int, 
    属性 varchar(10), ) INSERT INTO 表1 
    select '1','姓名' union all 
    select '2','年龄' union all
    select '3','学校' CREATE TABLE 表2 
    ( id  int,
    属性id int, 
    内容 varchar(10),
    记录id  varchar(10), ) INSERT INTO 表2
    select '1','1','刘德华','A' union all 
    select '2','2','30','A' union all
    select '3','3','清华','A' union all
    select '4','1','张三','B' union all
    select '5','2','20','B' union all
    select '6','3','北大','B'
    --SQL SERVER 2000 动态SQL
    declare @sql varchar(8000)
    select @sql = isnull(@sql + '],[' , '') + 属性 from 表1 group by 属性
    set @sql = '[' + @sql + ']'
    exec ('select 姓名,年龄,学校 from (select 表1.属性,表2.内容,表2.记录id from 表1,表2 where 表1.id=表2.属性id) a pivot (max(内容) for 属性 in (' + @sql + ')) b')
    --SQL SERVER 2005 静态SQL。 select 姓名,年龄,学校 from (select 表1.属性,表2.内容,表2.记录id from 表1,表2 where 表1.id=表2.属性id) a pivot (max(内容) for 属性 in (姓名,年龄,学校)) b
      

  3.   

    if object_id('[tb1]') is not null drop table [tb1]
    go
    create table [tb1]([id] int,[属性] varchar(4))
    insert [tb1]
    select 1,'姓名' union all
    select 2,'年龄' union all
    select 3,'学校'
    go
    if object_id('[tb2]') is not null drop table [tb2]
    go
    create table [tb2]([id] int,[属性id] int,[内容] varchar(6),[记录id] varchar(1))
    insert [tb2]
    select 1,1,'刘德华','A' union all
    select 2,2,'30','A' union all
    select 3,3,'清华','A' union all
    select 4,1,'张三','B' union all
    select 5,2,'20','B' union all
    select 6,3,'北大','B'
    godeclare @sql varchar(8000)
    select
      @sql=isnull(@sql+',','')
      +'max(case when 属性id='+ltrim(id)+' then 内容 else '''' end) as ['+属性+']'
    from
    (select a.id,a.属性 from tb1 a join tb2 b on a.id=b.属性id group by a.id,a.属性) texec ('select '+@sql+' from tb2 group by (id-1)/3')/**
    姓名     年龄     学校
    ------ ------ ------
    刘德华    30     清华
    张三     20     北大(2 行受影响)
    **/
      

  4.   

    good212164,sqlserver2000的没有pivot函数的
    select* into #tt from(select*from 表1,表2 where 表1.ID=表2.属性ID)t
    declare @s varchar(max)
    set @s='select 记录id '
    select @s=@s
    +','+quotename(属性 )
    +N'=case 属性 when '+quotename(jc,N'''')  
    +N' then 内容  end'from #tt group by 属性
    exec(@s
    +N'from #tt group by 记录id ')
    print(@s)
    drop table #tt
      

  5.   

    谢谢大家,等我这边优化出最好的sql,我拿出来给大家分享
    然后结贴