Отчет менеджера сотрудника - Sql Server - PullRequest
0 голосов
/ 01 июля 2011

У меня есть таблица ниже

empid   empname     managerID
1          A          NULL
2          B           1
3          C           1
4          D           2

Значение ddl соответствует

Declare @t table(empid int, empname varchar(20), managerID int)
insert into @t 

select 1,'A',null union all
select 2,'B',1 union all
select 3,'C',1 union all 
select 4,'D',2

Что мне нужно сделать, это подготовить отчет, в котором будет указано, какие сотрудники отчитываются перед каким менеджером.

Я обработал его, используя

select EmpName = e.empname, ManagerName = m.empname
from @t e 
left join
@t m
on  e.managerID = m.empid  

, и желаемый результат был

EmpName    ManagerName
A          NULL
B          A
C          A
D          B

Каковы другие способы сделать это?

Ответы [ 4 ]

1 голос
/ 06 июля 2011
Declare @t table(empid int, empname varchar(20), managerID int)

insert into @t 
select 1,'A',null union all
select 2,'B',1 union all
select 3,'C',1 union all 
select 4,'D',2

;with CTE AS
(
    Select empid,empname,managerID,
    Cast(empname As Varchar(max)) As ReportingManager
    from @T
    where managerID is null

    UNION ALL

    Select T.empid,T.empname,T.managerID,
    Cast(CTE.empname+'->'+t.empname As Varchar(max)) As ReportingManager
    from @T As T
    INNER JOIN CTE ON T.managerID=CTE.empid 
)
SELECT *
FROM CTE

0 голосов
/ 05 ноября 2011

Хорошо, значит, вы просили другие способы.Это немного странно.

CREATE TABLE employee (empid int, empname varchar(20), managerID int)
GO
insert into employee 

select 1,'A',null union all
select 2,'B',1 union all
select 3,'C',1 union all 
select 4,'D',2
GO

CREATE FUNCTION [dbo].[GetEmployeeTree](@ManagerId int)
RETURNS XML
WITH RETURNS NULL ON NULL INPUT 
BEGIN RETURN 
  (SELECT   empID as '@Id', 
            empname AS '@Name',
            dbo.GetEmployeeTree(empid) 
   FROM employee em
   WHERE ManagerId=@ManagerId
   FOR XML PATH('Employee'), TYPE)
END

GO
SELECT  empID as '@Id', 
        empname AS '@Name',
        dbo.GetEmployeeTree(empId) 
FROM employee
WHERE managerId is null
FOR XML PATH('Employee'), ROOT('Employees')

Что дает этот вывод

<Employees>
  <Employee Id="1" Name="A">
    <Employee Id="2" Name="B">
      <Employee Id="4" Name="D" />
    </Employee>
    <Employee Id="3" Name="C" />
  </Employee>
</Employees>

Я фактически использовал это для генерации больших деревьев XML с десятками тысяч узлов, и это довольно быстро.Вероятно, есть способ объединить корневой запрос с дочерним, но я пока не совсем понял.Когда я использовал эту технику в прошлом, я использовал отдельную ссылку и таблицу узлов для определения иерархии, и она работает немного чище, когда вы делаете это.

0 голосов
/ 01 июля 2011

Сам присоединиться к столу

вариант 1: все сотрудники, у которых есть менеджеры

select e1.empname employee, e2.empname manager
from employee e1
join employee e2 on e1.managerId = e2.empid
order by e2.name,e1.name

вариант 2: все сотрудники, у которых есть менеджеры или нет

select e1.empname employee, COALESCE(e2.empname,'none') manager
from employee e1
left join employee e2 on e1.managerId = e2.empid
order by e2.name,e1.name
0 голосов
/ 01 июля 2011

Я думаю, ваше решение является наиболее подходящим, но мы можем переписать его, например ::10000

select t1.empname [EmpName]
    , (select t2.empname from @t t2 where t2.empid = t1.managerID) [ManagerName]
from @t t1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...