2016-10-24 2 views
0

Я борюсь с запросом, чтобы вернуть список менеджеров с их соответствующими сотрудникамиT-SQL - Объединить нескольких строк

У меня есть три таблицы следующим образом:

Managers 
ManagerID ManagerName 
1   Bob 
2   Sally 
3   Peter 
4   George 

EmployeeManager 
EmployeeID ManagerID 
1   1 
1   1 
2   2 
2   2 
3   3 
3   3 
4   4 
4   4 

Employees 
EmployeeID EmployeeName 
1   David 
1   Joseph 
2   Adam 
2   Pete 
3   Mark 
3   Mavis 
4   Susan 
4   Jennifer 

Желаемая Result Set

ManagerName CountEmployee Employees 
Bob   2    David, Joseph 
Sally  2    Anish, Pete 
Peter  2    Mark, Mavis 
George  2    Susan, Jennifer 

запрос настоящее время я использую выглядит следующим образом:

Select m.ManagerName 
     ,Count(e.EmployeeName) Over(Partition By m.ManagerID) as CountEmployee 
     ,Rank() Over(Partition By m.ManagerID Order By em.EmployeeID) [RankEmployee] 
     ,e.EmployeeName 
From dbo.Employees e 
Left Join dbo.EmployeeManager em on em.ManagerID=e.ManagerID 
Left Join dbo.Managers m on m.ManagerID=em.ManagerID; 

Это возвращает список менеджеров и сотрудников по отдельным строкам, но я изо всех сил пытаюсь объединить имена сотрудников в соответствии с приведенной выше таблицей.

Любые идеи или решения?

Manpaal Singh

+0

Поиск для этого: ** имитирующей '' GROUP_CONCAT' в SQL SERVER' ** –

+0

@msinghm Вы можете запихнуть результат to comma seperated result: http://stackoverflow.com/a/18870585/6812070 –

ответ

0
SELECT M.ManagerName, E.EmployeeName 
FROM Managers AS M 
INNER JOIN EmployeeManager AS EM ON M.ManagerID = EM.ManagerID 
INNER JOIN Employees AS E ON EM.EmployeeID = E.EmployeeID 
ORDER BY M.ManagerName 

Это даст список руководителей и их сотрудников. , когда вы устанавливаете идентификаторы таблицы сотрудников.

1  David 
1  Joseph 
2  Adam 
2  Pete 
3  Mark 
3  Mavis 
4  Susan 
4  Jennifer 

должен быть:

1  David 
2  Joseph 
3  Adam 
4  Pete 
5  Mark 
6  Mavis 
7  Susan 
8  Jennifer 
+0

Спасибо всем, у меня теперь есть это, чтобы работать. Вы все очень помогли. – msinghm

1

Вы можете stuff результат в запятые результата.

Select m.ManagerName 
        ,Count(e.EmployeeName) Over(Partition By m.ManagerID) as CountEmployee 
        ,Rank() Over(Partition By m.ManagerID Order By em.EmployeeID) [RankEmployee] 
        ,STUFF((SELECT ',' + e.EmployeeName 
          FOR XML PATH('')), 1, 1, '') AS EmployeeName 
     From dbo.Employees e 
     Left Join dbo.EmployeeManager em on em.ManagerID=e.ManagerID 
     Left Join dbo.Managers m on m.ManagerID=em.ManagerID 
0

вы можете использовать рекурсивные SQL для преобразования строки в строку:

with t1 (mngId, empName) as (
    select a.mngId, 
      b.empname 
    from manager as a, employee as b 
    where b.mngId = a.mngId), 
t2 (mngID, nbr, empName, all_name) as (
    select mngId, 
     cast(1 as Int), 
     min(empName), 
     cast(min(empName) as varchar(1000) 
    from t1 
    group by mngId 
    union all 
    select b.mngId, 
     b.nbr+1, 
     a.empName, 
     trim(b.all_name) concat ', ' concat a.empName 
    from t0 as a, t1 as b 
    where b.mngId = a.mngId 
     and a.empName > b.empName 
     and a.empName = (
      select min(c.empName) 
      from t0 as c 
      where c.mngId = b.mngId 
       and c.empName > b.empName) 
) 
select * 
from t1 as e 
where nbr = ( 
    select max(nbr) 
    from t1 as d 
    where d.mngId = e.mngId) 
Смежные вопросы