繁体   English   中英

合并多个表中的行

[英]Combining rows from several tables

我正在用SSRS编写报告,但遇到了一个难题,试图让一栏按我的意愿工作。 我们的数据库设置有3个表,一个表具有职员名称和ID(员工),一个具有角色名称和ID(角色),以及一个动态表,该表将staffID和RoleID链接(链接):

职员桌

StaffName | StaffID
----------+--------
Tom       | 101
Dick      | 102
Harry     | 103

链接表

StaffID | RoleID
--------+-------
101     | 1
102     | 2
102     | 3
103     | 3
103     | 4

角色表

RoleID | RoleName
-------+---------
1      | a
2      | b
3      | c
4      | d

我正在尝试将其压缩为一个输出以放入SSRS,如下表所示:

输出表

StaffName | RoleName
----------+---------
Tom       | a
Dick      | b, c
Harry     | c, d

不幸的是,由于它们被链接在一起,所以我很难获得所需的输出。 到目前为止,我有一个表以正确的方式输出RoleID,但没有输出RoleName,如下所示:

StaffID | RoleIDs | Rolenames
--------+---------+----------
101     | 1       | a
102     | 2, 3,   | b
102     | 2, 3,   | c
103     | 3, 4,   | c
103     | 3, 4,   | d

为此,我使用以下代码:

SELECT DISTINCT 
    Links2.StaffID,
    substring(
    (
        SELECT 
            CAST (Links1.RoleID AS varchar(max)) + ', ' AS [text()]
        FROM Links AS Links1
        WHERE Links1.StaffID = Links2.StaffID
        ORDER BY Links1.StaffID
        For XML PATH ('')
    ), 1, 1000) AS RoleIDs,
    substring(
    (
        SELECT
        CAST (Roles1.RoleName AS varchar(max)) + ', ' as [text()]
        FROM Roles AS Roles1
        WHERE Roles1.RoleID = Roles2.RoleID
        ORDER BY Role1.RoleID
        FOR XML PATH('')
    ), 1, 1000) AS RoleNames
FROM Links AS Links2
LEFT OUTER JOIN Roles Roles2
ON Roles2.RoleID = Links2.RoleID

如果关闭格式,将不胜感激,并向您道歉。

谢谢罗布

@Rob,尝试以下解决方案,

select s.staffName,
         STUFF((SELECT ', ' + CAST(r.RoleName AS VARCHAR(10)) [text()]
         FROM Roles r1  
         inner join Links l on l.StaffID = s.StaffID
         inner join Roles r on r.RoleID = l.RoleID
         WHERE r1.RoleID = r.RoleID
         FOR XML PATH(''), TYPE)
        .value('.','NVARCHAR(MAX)'),1,2,' ') List_Output
from Staff s

我没有在SQL Server上尝试过查询,但是这种方法应该可行。 创建一个临时表,并在其中插入与“工作人员和链接”相关的数据。 然后将内部联接放在带有角色表的临时表上,以获得所需的结果:

CREATE TABLE #TempStaffAndLink
  (
    StaffId INT,
    StaffName VARCHAR(30), 
    RoleId INT
   );


INSERT INTO #TempStaffAndLink
SELECT Staff.StaffId, Staff.StaffName, Link.RoleId from Staff 
INNER JOIN Link
ON Staff.StaffId = Link.StaffId;

这将在一个带有StaffName的表中为您提供StaffId和RoleId。 现在将内部联接放在Roles表上以获取RoleName:

SELECT #TempStaffAndLink.StaffName as StaffName, Role.RoleName as RoleName
FROM #TempStaffAndLink
INNER JOIN Role
ON #TempStaffAndLink.RoleId = Role.RoleId;

尝试这个..

select StaffName ,string_agg(RoleName,',') as RoleName
from (
select a.StaffName,a.StaffID,b.RoleID,c.RoleName
from Staff_table a 
left outer join Links_table b
on a.StaffID = b.StaffID
left outer join Roles_table c
on b.RoleID = c.RoleID 
)x
group by 1 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM