目標:從 MS SSRS ReportServer 資料庫中提取報告使用統計資訊。然后,鏈接到單獨資料庫(同一服務器)中的另一個表以提取員工姓名(報表服務器僅列出某人的 Windows 登錄名)。
問題:我撰寫了一個運行沒有錯誤的查詢,但我可以確認它提取了太多記錄。我認為這是因為員工檔案中每個員工都有多條記錄,并且沒有唯一的列可以關閉。我認為它可以與加入有關,但我無法弄清楚,所以希望有人能提供幫助。
表 1 - 目錄(ReportServer DB)
| 型別 | 物品編號 | 姓名 |
|---|---|---|
| 2 | 隨機唯一的數字序列 | 報告名稱 A |
| 3 | 隨機唯一的數字序列 | 報告名稱 G |
表 2 - ExecutionLogStorage (ReportServer DB) | 時間開始 | 時間日期\a檢索| 時間處理 | 行數 | 位元組數 | 用戶名|報告ID| |:--------- |:----------------:|:--------------:|:- --------:| :--------:|:--------:|---------:| | 2022-03-16 07:00:16:767| 11000| 500| 250| 150| 域\用戶名 | 亂數列 |
此表上唯一的唯一列是 LogEntryId 列(每行的數字)。
表 3 - 用戶 (ReportServer DB) | 用戶名| |:----------------:| | 域\用戶名 |
用戶名是唯一的(每個用戶名存在一行)
表 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 運氣不佳,所以我想知道這是否與最后一次加入有關?但是,如果該表上的每個人都有多條記錄,我將如何從員工表中提取員工姓名?
當前輸出的格式是這樣的:| 員工姓名 | 職位 | 報告執行| 獨特的報告| |:------------- |:--------:|:----------------:| -------------:| | 約翰·史密斯 | 導演 | 1000 | 50 | | 瑪麗艾倫 | 經理| 500| 10|
uj5u.com熱心網友回復:
如果您的重復項在其中,[CustomDB].[Employees]則只需從此表中選擇不同的值。
所以改變這個
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/476782.html
