簡體   English   中英

T-SQL-串聯多行

[英]T-SQL - Concatenate Multiple Rows

我正在努力查詢以返回經理及其各自員工的列表

我有三個表,如下所示:

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

所需結果集

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)

您可以將結果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
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

這將列出經理及其雇員的清單。 當您固定employees表的ID時。

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

您可以使用遞歸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 ) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM