目标:从 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