两个表 1、SJDDETAIL 
SJBH            YPDM           JCDD 
  1               1           我 
  1               2           他 
  2               3           我们 
  2               4           他们 2、SJDFIELD 
SJBH         YPDM               fieldname     fieldvalue 
1                 1               眼睛                   红 
1                 1               头发                   蓝 
1                 2               眼睛                   黑
2                 3               国籍                   美国   
2                 3               城市                   北京 
2                 4               身高                   180 要求写一语句,得到如下: 
SJBH             YPDM       JCDD         眼睛     头发       年龄         国籍       城市       身高  
1                 1          我             红       蓝
1                 2          他           黑 
2                 3          我们                                      美国       北京
2                 4          他们                                                          180 

解决方案 »

  1.   

    这个很简单,在SQL SERVER 2005里面有个新特性,PIVOT,UNPIVOT,就是进行行列转换的,您可以看一下.语句照常写,加一下就成.
      

  2.   

    declare @a table (sjbh int,ypdm int,jcdd varchar(10))
    insert into @a select 1,1,'我'
    insert into @a select 1,2,'他'
    insert into @a select 2,3,'我们'
    insert into @a select 2,4,'他们'
    declare @b table (sjdfield int,ypdmfield int,fieldname varchar(20),fieldvalue varchar(10))
    insert into @b select 1,1,'眼睛','红'
    insert into @b select 1,1,'头发','蓝'
    insert into @b select 1,2,'眼睛','黑'
    insert into @b select 2,3,'国籍','美国'
    insert into @b select 2,3,'城市','北京'
    insert into @b select 2,4,'身高','180'select sjbh,ypdm,jcdd,
    max(case when fieldname='眼睛' then fieldvalue else '' end) as '眼睛',
    max(case when fieldname='头发' then fieldvalue else '' end) as '头发',
    max(case when fieldname='国籍' then fieldvalue else '' end) as '国籍',
    max(case when fieldname='城市' then fieldvalue else '' end) as '城市',
    max(case when fieldname='身高' then fieldvalue else '' end) as '身高'
    from(
    select * from @a a left join @b b on a.sjbh=b.sjdfield and a.ypdm=b.ypdmfield) t
    group by sjbh,ypdm,jcddsjbh ypdm jcdd 眼睛 头发 国籍 城市 身高
    1 1 我 红 蓝
    1 2 他 黑
    2 3 我们 美国 北京
    2 4 他们 180
      

  3.   

    随便看看
    >>>>>>>>>>>>
    代码是有错误的,眼睛只能出来一个
      

  4.   


    select s1.*,s2.fieldvalue 眼睛,s3.fieldvalue 头发,s4.fieldvalue 国籍,
    s5.fieldvalue 城市,s6.fieldvalue 身高
    from SJDDETAIL s1,SJDFIELD s2,SJDFIELD s3 ,SJDFIELD s4,SJDFIELD s5,SJDFIELD s6 
    where s1.SJBH=s2.SJBH and s2.SJBH=s3.SJBH and s3.SJBH=s4.SJBH and s4.SJBH=s5.SJBH and s5.SJBH=s6.SJBH
    and s1.YPDM=s2.YPDM and s2.YPDM=s3.YPDM and s3.YPDM=s4.YPDM and s4.YPDM=s5.YPDM and s5.YPDM=s6.YPDM 
    and s2.fieldname='眼睛' and s3.fieldname='头发' and s4.fieldname='国籍' and s5.fieldname='城市' and s6.fieldname='身高'但愿你的元素不是很多
    而且表不是很大
    交叉连接对表的操作数据是很大的
      

  5.   


    create table SJDDETAIL(SJBH varchar(5), YPDM varchar(5),  JCDD  varchar(10))
    insert into SJDDETAIL
    select '1' as SJBH,   '1' as YPDM,   '我' as JCDD
    union all
    select '1','2','他'  
    union all
    select '2','3','我們'   
    union all
    select '2','4','他們' create table SJDFIELD(SJBH varchar(5), YPDM  varchar(5), fieldname varchar(10),  fieldvalue varchar(10))   
    insert into SJDFIELD
    select '1' as SJBH,   '1' as YPDM,   '眼睛' as fieldname,  '紅' as fieldvalue
    union all
    select '1','1','頭髮','藍' 
    union all
    select '1','2','眼睛','黑'
    union all
    select '2','3','國籍','美國'       
    union all
    select '2','3','城市','北京'   
    union all
    select '2','4','身高','180'   select D.SJBH, D.YPDM ,D.JCDD,
    max(case when F.fieldname='眼睛'then F.fieldvalue else '' end ) as '眼睛',
    max(case when F.fieldname='頭髮'then F.fieldvalue else '' end ) as '頭髮',
    max(case when F.fieldname='年齡'then F.fieldvalue else '' end ) as '年齡',
    max(case when F.fieldname='國籍'then F.fieldvalue else '' end ) as '國籍',
    max(case when F.fieldname='城市'then F.fieldvalue else '' end ) as '城市',
    max(case when F.fieldname='身高'then F.fieldvalue else '' end ) as '身高'from SJDDETAIL as D
    left join  SJDFIELD as F on D.SJBH=F.SJBH and D.YPDM=F.YPDM
    group by D.SJBH, D.YPDM ,D.JCDD
    drop table SJDDETAIL,SJDFIELD
    ----------------------------------
    (4 個資料列受到影響)(6 個資料列受到影響)
    SJBH  YPDM  JCDD       眼睛         頭髮         年齡         國籍         城市         身高
    ----- ----- ---------- ---------- ---------- ---------- ---------- ---------- ----------
    1     1     我          紅          藍                                           
    1     2     他          黑                                                      
    2     3     我們                                          美國         北京         
    2     4     他們                                                                180(4 個資料列受到影響)
      

  6.   

    create table SJDDETAIL(sjbh int,ypdm int,jcdd varchar(10))
    insert into SJDDETAIL select 1,1,'我'
    union all select 1,2,'他'
    union all select 2,3,'我們'
    union all select 2,4,'他們'
    create table SJDFIELD(sjdfield int,ypdmfield int,fieldname varchar(10),fieldvalue varchar(10))
    insert into SJDFIELD select 1,1,'眼睛','紅'
    union all select 1,1,'頭發','藍'
    union all select 1,2,'眼睛','黑'
    union all select 2,3,'國籍','美國'
    union all select 2,3,'城市','北京'
    union all select 2,4,'身高','180'select sjbh,ypdm,jcdd,
    max(case when fieldname='眼睛' then fieldvalue else '' end) as '眼睛',
    max(case when fieldname='頭發' then fieldvalue else '' end) as '頭發',
    max(case when fieldname='國籍' then fieldvalue else '' end) as '國籍',
    max(case when fieldname='城市' then fieldvalue else '' end) as '城市',
    max(case when fieldname='身高' then fieldvalue else '' end) as '身高'
    from(     select * from @a a left join @b b on a.sjbh=b.sjdfield and a.ypdm=b.ypdmfield
        ) s
    group by sjbh,ypdm,jcdd
    1 1 我 紅 藍
    1 2 他 黑
    2 3 我們 美國 北京
    2 4 他們 180
      

  7.   

    多亏了2楼  学会了新用法
    create table SJDDETAIL(sjbh int,ypdm int,jcdd varchar(10))
    insert into SJDDETAIL select 1,1,'我'
    insert into SJDDETAIL select 1,2,'他'
    insert into SJDDETAIL select 2,3,'我们'
    insert into SJDDETAIL select 2,4,'他们'
    create table SJDFIELD(sjdfield int,ypdmfield int,fieldname varchar(20),fieldvalue varchar(10))
    insert into SJDFIELD select 1,1,'眼睛','红'
    insert into SJDFIELD select 1,1,'头发','蓝'
    insert into SJDFIELD select 1,2,'眼睛','黑'
    insert into SJDFIELD select 2,3,'国籍','美国'
    insert into SJDFIELD select 2,3,'城市','北京'
    insert into SJDFIELD select 2,4,'身高','180'select * from (select * from SJDFIELD
    pivot
    (
    max(fieldvalue)
    for fieldname in
    ([眼睛],[头发],[国籍],[城市],[身高])
    ) as SJDFIELD) s1
    right join SJDDETAIL s2 on s1.sjdfield=s2.sjbh and s1.ypdmfield=s2.ypdmdrop table SJDDETAIL
    go
    drop table SJDFIELD