两个表 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
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
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
>>>>>>>>>>>>
代码是有错误的,眼睛只能出来一个
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='身高'但愿你的元素不是很多
而且表不是很大
交叉连接对表的操作数据是很大的
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 個資料列受到影響)
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
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