连接 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