日期:2014-05-19  浏览次数:20570 次

一个比较有难度的行转列的问题。都来看看吧!!!!!!!!(非常急)
有两张表:jobs和company

jobs
uid               ftitle
2 程序员
6 硬件维护
7 软件开发
2 网站策划
2 人事主管

company
uid               fname
2 公司1
6 公司2
7 公司3

我现在要把两个表合并为一个表,表的结构如下
uid         fname           fitle1           ftitle2
2               公司1         程序员         网站策划      
6               公司2         硬件维护       null
7               公司3         软件开发       null

注意:职位表里面只取出与公司表UID对应的前两条记录把它们转换成公司表的列ftitle1和ftitle2其他的省略。

数据是动态的哈。只做演示用。

------解决方案--------------------
如果只要两个
select uid,fname
,(select top 1 ftitle from jobs where uid=a.uid order by ftitle asc) as ftitle1
,(select top 1 ftitle from jobs where uid=a.uid order by ftitle desc) as ftitle2
from company a
------解决方案--------------------
or
临时表,保持次序

select IDENTITY(int,1,1) as id,* into # from jobs

select uid,fname
,(select ftitle from # t where uid=a.uid and not exists (
select 1 from # where uid=a.uid and id <t.id
)
) as ftitle1
,(select ftitle from jobs where uid=a.uid and (
select count(*) from # where uid=a.uid and id <t.id
)=1
) as ftitle2
from company a

------解决方案--------------------
--创建测试环境
drop table jobs,company
go
create table jobs(id int identity(1,1),uid int,ftitle varchar(20))
insert into jobs(uid,ftitle)
select 2, '程序员 '
union all select 6, '硬件维护 '
union all select 7, '软件开发 '
union all select 2, '网站策划 '
union all select 2, '人事主管 '

create table company(uid int,fname varchar(20))
insert into company
select 2, '公司1 '
union all select 6, '公司2 '
union all select 7, '公司3 '

--查询
select a.uid,
a.fname,
id1=(select top 1 id from jobs b where b.uid=a.uid order by b.ftitle),
fitle1=(select top 1 ftitle from jobs b where b.uid=a.uid order by b.ftitle),
id2=(select top 1 id from jobs c where c.uid=a.uid and c.ftitle <> (select top 1 ftitle from jobs b where b.uid=a.uid order by b.ftitle)),
fitle2=(select top 1 ftitle from jobs c where c.uid=a.uid and c.ftitle <> (select top 1 ftitle from jobs b where b.uid=a.uid order by b.ftitle))
from company a
/*
uid fname id1 fitle1 id2 fitle2
----------- -------------------- ----------- -------------------- ----------- --------------------
2 公司1 1 程序员 4 网站策划
6 公司2 2 硬件维护 NULL NULL
7 公司3 3 软件开发 NULL NULL

(所影响的行数为 3 行)
*/
------解决方案--------------------
select a.uid,
a.fname,
ftitle1=(select top 1 ftitle from jobs b where b.uid=a.uid order by b.ftitle),
ftitle2=(select top 1 ftitle from jobs c where c.uid=a.uid and c.ftitle not in(select top 1 ftitle from jobs b where b.uid=a.uid order by b.ftitle)order by c.ftitle),