Присоединяйтесь к 4 таблицам в 2 базах данных — получение дубликатов

Цель: получить статистику использования отчетов из базы данных 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|

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если ваши дубликаты находятся в [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

Я попытался обновить часть запроса следующим образом: 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'

Zakiya 14.05.2022 18:25

Извините, я новичок и плохо разбираюсь в форматировании здесь. Проблема в том, что мне нужно переместить предложение WHERE куда-то еще или добавить в скобки? Я пробовал несколько разных сценариев, но он все еще выдает ошибки.

Zakiya 14.05.2022 18:27

Я заметил, что если у меня есть [CustomDB].[Employees]) AS Employees, я получаю массу ошибок «невозможно связать». Я пытался добавить псевдонимы в запрос, но это не помогло. Есть ли что-то еще, что может вызвать это?

Zakiya 14.05.2022 18:55

Если ваш исходный запрос работал, но возвращал дубликаты, тогда все, что вам нужно было сделать, это поменять одну строку на модифицированную версию, которую я разместил, и она должна работать.

Alan Schofield 15.05.2022 00:23

Должно быть, я вчера запутался. Теперь он работает с вашей модификацией Alan. Большое спасибо за помощь новичку!

Zakiya 16.05.2022 02:55

Без проблем. Не могли бы вы пометить ответ как принятый (галочка слева от ответа под кнопками голосования вверх/вниз). Это поможет другим найти ответы на похожие вопросы.

Alan Schofield 16.05.2022 11:30

Другие вопросы по теме