连接 2 个数据库中的 4 个表 - 获取重复项
Join 4 tables across 2 databases - Getting duplicates
Objective:从 MS SSRS ReportServer 数据库中提取报告使用统计信息。然后,link 到单独数据库(同一服务器)中的另一个 table 以提取员工姓名(报表服务器仅列出某人的 Windows 登录名)。
问题:我编写了一个运行无误的查询,但我可以确认它提取了太多记录。我认为这是因为员工文件中每个员工都有多条记录,并且没有一个唯一的列可以关闭。我认为它可以与连接一起使用,但我一直无法弄清楚,所以希望有人能提供帮助。
Table 1 - 目录(ReportServer 数据库)
Type
ItemID
Name
2
Random unique sequence of numbers
Report Name A
3
Random unique sequence of numbers
Report Name G
Table 2 - ExecutionLogStorage(报表服务器数据库)
|时间开始 | TimeDate\aRetrieval|时间处理 |行数 |字节数 |用户名|报告 ID|
|:---------- |:----------------:|:--------------:|:- ------:| :--------:|:--------:|--------:|
| 2022-03-16 07:00:16:767| 11000| 500| 250| 150| Domain\UserName |随机数字序列 |
此 table 上唯一的唯一列是 LogEntryId 列(每行一个数字)。
Table 3 - 用户(ReportServer 数据库)
|用户名|
|:----------------:|
| Domain\UserName |
用户名是唯一的(每个用户名对应一行)
Table 4 - 员工(自定义数据库)
| Windows登录|员工姓名|职位|
|:-------- |:----------------:|--------:|
| Domain\UserName |约翰·史密斯 |导演 |
| Domain\UserName |玛丽艾伦|经理 |
当前查询(导致错误计数(重复行,计数比预期高很多)
SELECT
EmployeeName,
Position,
sum(ExecCount) AS ExecCount,
sum(UniqueReportCount) AS UniqueReportCount
FROM
(SELECT
RE.EmployeeName,
RE.Position,
COUNT(*) AS ExecCount,
COUNT (DISTINCT RptName) AS UniqueReportCount
FROM
(SELECT
EX.TimeStart,
CAT.Type,
CAT.Name AS RptName,
EX.TimeDataRetrieval,
EX.TimeProcessing,
EX.TimeRendering,
EX.ByteCount,
Ex.[RowCount],
EX.UserName AS LogUser,
Users.UsernName,
Employees.WindowsLogIn,
Employees.EmployeeName,
Employees.Position
FROM [ReportServer].Catalog AS CAT
INNER JOIN [ReportServer].[ExecutionLogStorage] AS EX ON CAT.ItemID = EX.Report.ID
LEFT OUTER JOIN [ReportServer].[Users]. AS Users ON Users.UserName = EX.UserName
LEFT OUTER JOIN [CustomDB].[Employees] AS Employees ON Users.User = Employees.WindowsLogIn collate SQL_Latin1_General_CP1_CI_AS
WHERE Type = 2
AND EX.TimeStart BETWEEN @DateFrom AND @DateTo
) AS RE
GROUP BY
EmployeeName,
Position,
RptName
) AS UserLog
GROUP BY EmployeeName, Position
ORDER BY ExecCount DESC
当前输出
目前,我在 SSRS 中构建的报告中获得了预期的格式。这只是重复的数据。我试过更改 Group By 但运气不佳,所以我想知道这是否与上次加入有关?但是,如果 table 上的每个人都有多条记录,我将如何从员工 table 中提取员工姓名?
当前输出的格式是这样的:
|员工姓名 |当前位置 |报告执行|独特的报告|
|:------------ |:--------:|:----------------:| --------------:|
|约翰·史密斯 |导演 | 1000 | 50 |
|玛丽·艾伦 |经理| 500| 10|
如果您的重复项在 [CustomDB].[Employees]
中,那么只有 select 个与此 table 不同的值。
所以改变这个
LEFT OUTER JOIN [CustomDB].[Employees] AS Employees ON Users.User = Employees.WindowsLogIn collate SQL_Latin1_General_CP1_CI_AS
至此
LEFT OUTER JOIN (SELECT DISTINCT WindowsLogIn, EmployeeName, Position FROM [CustomDB].[Employees]) AS Employees ON Users.User = Employees.WindowsLogIn collate SQL_Latin1_General_CP1_CI_AS
Objective:从 MS SSRS ReportServer 数据库中提取报告使用统计信息。然后,link 到单独数据库(同一服务器)中的另一个 table 以提取员工姓名(报表服务器仅列出某人的 Windows 登录名)。
问题:我编写了一个运行无误的查询,但我可以确认它提取了太多记录。我认为这是因为员工文件中每个员工都有多条记录,并且没有一个唯一的列可以关闭。我认为它可以与连接一起使用,但我一直无法弄清楚,所以希望有人能提供帮助。
Table 1 - 目录(ReportServer 数据库)
Type | ItemID | Name |
---|---|---|
2 | Random unique sequence of numbers | Report Name A |
3 | Random unique sequence of numbers | Report Name G |
Table 2 - ExecutionLogStorage(报表服务器数据库) |时间开始 | TimeDate\aRetrieval|时间处理 |行数 |字节数 |用户名|报告 ID| |:---------- |:----------------:|:--------------:|:- ------:| :--------:|:--------:|--------:| | 2022-03-16 07:00:16:767| 11000| 500| 250| 150| Domain\UserName |随机数字序列 |
此 table 上唯一的唯一列是 LogEntryId 列(每行一个数字)。
Table 3 - 用户(ReportServer 数据库) |用户名| |:----------------:| | Domain\UserName |
用户名是唯一的(每个用户名对应一行)
Table 4 - 员工(自定义数据库) | Windows登录|员工姓名|职位| |:-------- |:----------------:|--------:| | Domain\UserName |约翰·史密斯 |导演 | | Domain\UserName |玛丽艾伦|经理 |
当前查询(导致错误计数(重复行,计数比预期高很多)
SELECT
EmployeeName,
Position,
sum(ExecCount) AS ExecCount,
sum(UniqueReportCount) AS UniqueReportCount
FROM
(SELECT
RE.EmployeeName,
RE.Position,
COUNT(*) AS ExecCount,
COUNT (DISTINCT RptName) AS UniqueReportCount
FROM
(SELECT
EX.TimeStart,
CAT.Type,
CAT.Name AS RptName,
EX.TimeDataRetrieval,
EX.TimeProcessing,
EX.TimeRendering,
EX.ByteCount,
Ex.[RowCount],
EX.UserName AS LogUser,
Users.UsernName,
Employees.WindowsLogIn,
Employees.EmployeeName,
Employees.Position
FROM [ReportServer].Catalog AS CAT
INNER JOIN [ReportServer].[ExecutionLogStorage] AS EX ON CAT.ItemID = EX.Report.ID
LEFT OUTER JOIN [ReportServer].[Users]. AS Users ON Users.UserName = EX.UserName
LEFT OUTER JOIN [CustomDB].[Employees] AS Employees ON Users.User = Employees.WindowsLogIn collate SQL_Latin1_General_CP1_CI_AS
WHERE Type = 2
AND EX.TimeStart BETWEEN @DateFrom AND @DateTo
) AS RE
GROUP BY
EmployeeName,
Position,
RptName
) AS UserLog
GROUP BY EmployeeName, Position
ORDER BY ExecCount DESC
当前输出 目前,我在 SSRS 中构建的报告中获得了预期的格式。这只是重复的数据。我试过更改 Group By 但运气不佳,所以我想知道这是否与上次加入有关?但是,如果 table 上的每个人都有多条记录,我将如何从员工 table 中提取员工姓名?
当前输出的格式是这样的: |员工姓名 |当前位置 |报告执行|独特的报告| |:------------ |:--------:|:----------------:| --------------:| |约翰·史密斯 |导演 | 1000 | 50 | |玛丽·艾伦 |经理| 500| 10|
如果您的重复项在 [CustomDB].[Employees]
中,那么只有 select 个与此 table 不同的值。
所以改变这个
LEFT OUTER JOIN [CustomDB].[Employees] AS Employees ON Users.User = Employees.WindowsLogIn collate SQL_Latin1_General_CP1_CI_AS
至此
LEFT OUTER JOIN (SELECT DISTINCT WindowsLogIn, EmployeeName, Position FROM [CustomDB].[Employees]) AS Employees ON Users.User = Employees.WindowsLogIn collate SQL_Latin1_General_CP1_CI_AS