Цель: получить статистику использования отчетов из базы данных MS SSRS ReportServer. Затем свяжитесь с другой таблицей в отдельной базе данных (тот же сервер), чтобы получить имена сотрудников (сервер отчетов содержит только чье-то имя для входа в Windows).
Проблема: Я написал запрос, который выполняется без ошибок, но могу подтвердить, что он извлекает слишком много записей. Я думаю, это связано с тем, что в файле сотрудника есть несколько записей для каждого сотрудника, и нет уникального столбца, из которого можно было бы выйти. Я думаю, что это может быть связано с соединением, но я не смог понять это, поэтому надеюсь, что кто-то может помочь.
Таблица 1 – Каталог (БД ReportServer)
Тип | ID товара | Имя |
---|---|---|
2 | Случайная уникальная последовательность чисел | Название отчета А |
3 | Случайная уникальная последовательность чисел | Название отчета G |
Таблица 2. ExecutionLogStorage (БД ReportServer) | ВремяНачало | ВремяДата\Получение| Обработка времени | Количество строк | Количество байтов | Имя пользователя|Идентификатор отчета| |:--------- |:----------------:|:---------------:|:- -------:| :--------:|:--------:|---------:| | 2022-03-16 07:00:16:767| 11000| 500| 250| 150| Домен\ИмяПользователя | Случайная последовательность чисел |
Единственным уникальным столбцом в этой таблице является столбец LogEntryId (число для каждой строки).
Таблица 3. Пользователи (БД ReportServer) | Имя пользователя| |:----------------:| | Домен\ИмяПользователя |
Имя пользователя уникально (для каждого имени пользователя существует одна строка)
Таблица 4 – Сотрудники (Пользовательская БД) | WindowsLogIn|ИмяСотрудника| Позиция| |:--------- |:----------------:|----------:| | Домен\имя пользователя |Джон Смит | Директор | | Домен\ИмяПользователя | Мэри Аллен| менеджер |
Текущий запрос (приводящий к ошибочным подсчетам (дублирующиеся строки, гораздо более высокие подсчеты, чем ожидалось)
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|
Если ваши дубликаты находятся в [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
Извините, я новичок и плохо разбираюсь в форматировании здесь. Проблема в том, что мне нужно переместить предложение WHERE куда-то еще или добавить в скобки? Я пробовал несколько разных сценариев, но он все еще выдает ошибки.
Я заметил, что если у меня есть [CustomDB].[Employees]) AS Employees, я получаю массу ошибок «невозможно связать». Я пытался добавить псевдонимы в запрос, но это не помогло. Есть ли что-то еще, что может вызвать это?
Если ваш исходный запрос работал, но возвращал дубликаты, тогда все, что вам нужно было сделать, это поменять одну строку на модифицированную версию, которую я разместил, и она должна работать.
Должно быть, я вчера запутался. Теперь он работает с вашей модификацией Alan. Большое спасибо за помощь новичку!
Без проблем. Не могли бы вы пометить ответ как принятый (галочка слева от ответа под кнопками голосования вверх/вниз). Это поможет другим найти ответы на похожие вопросы.
Я попытался обновить часть запроса следующим образом: 1) переместил элементы SELECT для таблицы сотрудников в новый подзапрос по вашему предложению и 2) добавил в новый подзапрос. Но я получаю сообщения об ошибках: 'LEFT OUTER JOIN [ReportServer].[Users]. AS Users ON Users.UserName = EX.UserName WHERE TYPE = 2 (ОШИБКА) LEFT OUTER JOIN (SELECT DISTINCT WindowsLogIn, EmployeeName, Position FROM [CustomDB].[Employees]) AS Employees ON Ошибка Users.User = Employees.WindowsLogIn сопоставить SQL_Latin1_General_CP1_CI_AS'