sql - Join 4 tables 跨 2 个数据库 - 获取重复项

目标:从 MS SSRS ReportServer 数据库中提取报告使用统计信息。然后,链接到单独数据库(同一服务器)中的另一个 table 以获取员工姓名(报告服务器仅列出某人的 Windows 登录名)。

问题:我编写了一个运行没有错误的查询,但我可以确认它提取了太多记录。我认为这是因为员工文件中每个员工都有多条记录,并且没有唯一的列可以关闭。我认为它可以与 join 一起做,但我无法弄清楚,所以希望有人能提供帮助。

Table 1 - 目录(ReportServer DB)

Type ItemID Name
2 Random unique sequence of numbers Report Name A
3 Random unique sequence of numbers Report Name G

Table 2 - ExecutionLogStorage (ReportServer DB) |时间开始 |时间日期\a检索|时间处理 |行数 |字节数 |用户名|报告ID| |:--------- |:----------------:|:--------------:|:- --------:| :--------:|:--------:|---------:| | 2022-03-16 07:00:16:767| 11000| 500| 250| 150|域\用户名 |随机数列 |

此 table 上唯一的唯一列是 LogEntryId 列(每行的数字)。

Table 3 - 用户 (ReportServer DB) |用户名| |:----------------:| |域\用户名 |

用户名是唯一的(每个用户名存在一行)

Table 4 - 员工(自定义数据库)| Windows登录|员工姓名|职位| |:--------- |:----------------:|---------:| |域\用户名 |约翰·史密斯 |导演 | |域\用户名 |玛丽艾伦|经理 |

当前查询(导致错误计数(重复行,计数比预期高得多)

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 运气不佳,所以我想知道它是否与最后一个 join 有关?但是,如果 table 上的每个人都有多个记录,我将如何从员工 table 中提取员工姓名?

当前输出的格式是这样的:|员工姓名 |职位 |报告执行|独特的报告| |:------------- |:--------:|:----------------:| -------------:| |约翰·史密斯 |导演 | 1000 | 50 | |玛丽艾伦 |经理| 500| 10|

回答1

如果您的重复项在 [CustomDB].[Employees] 中,则只需从此 table 中选择不同的 values。

所以改变这个

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

相似文章

svg - Scale 原点剪切路径 SVG {相机快门}

我正在尝试复制相机快门,它看起来好像我的路径是从左上角开始缩放的,基于它在剪切路径中的位置。我已将transform原点设置为50%,但它似乎没有按照我期望的方式工作。任何援助将不胜感激。#camer...

随机推荐

最新文章