如何获得经理,员工对输出?

时间:2015-05-22 18:23:00

标签: sql sql-server sql-server-2005

我只需要下面发布的必需输出。这个问题在接受采访时提出。

表格结构:

create table #test
(
id int,
emp char,
roles char
)

insert into #test values(1,'A','M')
insert into #test values(2,'B','E')
insert into #test values(3,'C','E')
insert into #test values(4,'D','M')
insert into #test values(5,'E','E')
insert into #test values(6,'F','E')
insert into #test values(7,'G','M')
insert into #test values(8,'H','E')
insert into #test values(9,'I','E')
insert into #test values(10,'J','E')

表:

Table

根据表格,我们已将员工安排到他的经理上 M =经理 E =雇员
注意:**经理角色下面的直接Emp角色是他们的员工 **例如:A是B的经理,C和D是E,F的经理
要求的输出:

Output

让我们看看谁会回答!

2 个答案:

答案 0 :(得分:3)

这是一个聪明的问题,我不认为我以前见过它。天哪,你实际上必须考虑创造输出的模式是什么。

对于那些看不到它的人来说," M"值在相应的" E"的第一列中。在下一个" M"之前的值。这在SQL Server 2012+中更容易表达,但这是SQL Server 2005中的一种方法:

我很确定这是他们想到的方法:

select tlm.emp, t.emp
from test t cross apply
     (select max(t2.id) as LastMId
      from test t2
      where t2.id <= t.id and t2.roles = 'M'
     ) tm join
     test tlm
     on tm.LastMId = tlm.id
where t.roles = 'E';

SQL小提琴是here

采访者注意:如果您使用此问题,只需将数据库更改为SQL Server 2012+即可。有更多优雅的解决方案,该系统提供的功能。

编辑:

这实际上是我想写的版本:

select tm.emp, t.emp
from test t cross apply
     (select top 1 t2.emp
      from test t2
      where t2.id <= t.id and t2.roles = 'M'
      order by t2.id desc
     ) tm
where t.roles = 'E';

答案 1 :(得分:2)

对于任何SQL Server版本,还有一种方法:

select t1.emp, t2.emp
from
(
select id,
case 
when t.roles = 'E' then (select emp from #test where id = (select max(id) from #test where id < t.id and roles = 'M')) 
end as emp
from #test t) t1
join 
#test t2 on t1.Id = t2.Id
where t1.emp is not null