[英]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.