表A  (不定行数)
id    项目
1      a
2      b
3      c
4      d
5      e
6      f
7      g
表B
体检编号      项目      结果
200607220001   a        正常
200607220001   b        正常
200607220001   c        不正常
200607220002   a        不正常
200607220002   b        正常
200607220002   f        正常
200607220002   g        正常我要的最后结果
体检编号        a      b      c      d      e     f       g
200607220001   正常   正常   不正常  null  null  null    null
200607220002  不正常  正常   null    null  null  正常    正常   

解决方案 »

  1.   

    Declare @sql varchar(8000)
    set @sql = 'select 体检编号'
    select @sql = @sql + ',(case 项目 when '''+项目+''' then 结果 else NULL end) ['+项目+']'
     from (select distinct 项目 from 表B) as aselect @sql = @sql+' from 表B  '
    exec(@sql)
                
      

  2.   

    Declare @sql varchar(8000)
    set @sql = 'select 体检编号'
    select @sql = @sql + ',(case 项目 when '''+项目+''' then 结果 else NULL end) ['+项目+']'
     from (select distinct 项目 from 表A) as a--should be Table A hereselect @sql = @sql+' from 表B  '
    exec(@sql)
      

  3.   

    --modifyDeclare @sql varchar(8000)
    set @sql = 'select 体检编号'
    select @sql = @sql + ',max(case 项目 when '''+项目+''' then 结果 else NULL end) ['+项目+']'
     from (select distinct 项目 from 表A) as a--should be Table A hereselect @sql = @sql+' from 表B  '
    exec(@sql)
      

  4.   

    谢谢楼上2位,我加了个max,否则记录重复
    Declare @sql varchar(8000)
    set @sql = 'select 体检编号'
    select @sql = @sql + ',max(case 项目 when '''+项目+''' then 结果 else NULL end) ['+项目+']'
     from (select distinct 项目 from 表A) as a--should be Table A hereselect @sql = @sql+' from 表B group by 体检编号' '
    exec(@sql)
      

  5.   

    Declare @sql varchar(8000)
    set @sql = 'select distinct 体检编号'
    select @sql = @sql + ',(select 结果 from B bb where bb.项目='''+A.项目+''' and bb.体检编号=B.体检编号) ['+项目+']'
     from A
    select @sql = @sql+' from 表B  '
    exec(@sql)
      

  6.   

    if exists(select * from sysobjects where name='表A' and xtype='U') drop table 表A
    if exists(select * from sysobjects where name='表B' and xtype='U') drop table 表B
    --生成测试用数据,为SELECT初始环境
    CREATE TABLE 表A(id int ,项目 varchar(10))
    INSERT INTO 表A SELECT 1,'a'
    UNION ALL SELECT 2,'b'
    UNION ALL SELECT 3,'c'
    UNION ALL SELECT 4,'d'
    UNION ALL SELECT 5,'e'
    UNION ALL SELECT 6,'f'
    UNION ALL SELECT 7,'g'
    CREATE TABLE 表B(体检编号 Varchar(20),项目 Varchar(10),结果 Varchar(10))
    INSERT INTO 表B SELECT '200607220001','a','正常'
    UNION ALL SELECT '200607220001',   'b','正常'
    UNION ALL SELECT '200607220001',   'c','不正常'
    UNION ALL SELECT '200607220002',   'a','不正常'
    UNION ALL SELECT '200607220002',   'b','正常'
    UNION ALL SELECT '200607220002',   'f','正常'
    UNION ALL SELECT '200607220002',   'g','正常'
    select * from 表A
    select * from 表B
    SElECT 项目 FROM 表A 
    GO
    --此处为用来查询的SELECT语句Declare @Sql Varchar(8000)
    SET @Sql='SELECT 体检编号'
    SELECT @Sql=@Sql+','+项目+'=MAX(Case 项目 WHEN '''+项目+''' THEN 结果 ELSE NULL END)' FROM 表A
    SELECT @SQL
    EXEC (@Sql+ ' from 表B GROUP BY 体检编号')
    GO
    --删除测试散数据
    DROP TABLE 表A,表B/* -- 结果 --
    体检编号                 a          b          c          d          e          f          g          
    -------------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- 
    200607220001         正常         正常         不正常        NULL       NULL       NULL       NULL
    200607220002         不正常        正常         NULL       NULL       NULL       正常         正常*/ -- 完成 --慢了点儿,还是贴出来...晕晕啊。