SQL Pivot для динамических строк и столбцов объединяется с их главной таблицей на основе имени поля - PullRequest
0 голосов
/ 15 апреля 2019

Мне нужно объединить динамически сводные данные с соответствующими таблицами на основе имен полей. У меня есть таблица журнала аудита, в которой есть данные в структуре на основе строк

AuditID      
Type        
TableName, 
LogBatchSeqID
PrimaryKeyField
PrimaryKeyValue
FieldName
OldValue,
NewValue, 
UpdateDate, 
UserName

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

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)



SET cols = SELECT STUFF((DISTINCT ',' + QUOTENAME(Name)
                  from Pres_AuditLogs
            where TableName=''MyTableName'' 
            group by FieldName, UpdateDate,[Type]

    FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)') 
,1,1,'')



  set @query = N'SELECT ' + @cols + 
  N',PrimaryKeyField,PrimaryKeyValue,UpdateDate,[type] from 
     (
        select NewValue, 
  FieldName,PrimaryKeyField,PrimaryKeyValue,UpdateDate,[Type]
        from Pres_AuditLogs
        where TableName=''MyTableName''  
    ) x
    pivot 
    (
        max(NewValue)
        for FieldName in (' + @cols + N')
    ) p order by UpdateDate desc  '

 exec sp_executesql @query;

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

 | -------- |------|--------|--------------|
 | EmpID    |DeptID|EditedBy|   Remarks    |
 | -------- |------|--------|--------------|
 |    2     |  8   |   40   | Test Remarks |
 | -------- |------|--------|--------------|

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

  |------|--------|------|-------- |--------|--------|--------------|
  |EmpID |Emp Name|DeptID|Dept Name|EditedBy|UserName|  Remarks     |
  |------|--------|------|-------- |--------|--------|--------------|
  |   2  |  Alex  |   8  | Finance |    40  | HrAdmin| Test Remarks |
  |------|--------|------|---------|--------|--------|--------------|

Я знаю, что могу выполнить присоединение, если знаю, что результат всегда будет получен из таблицы сотрудника путем объединения таблицы «Пользователь», «Отдел» и «Сотрудник». Но так как в таблице журнала аудита есть другие журналы таблиц, я не уверен, как лучше всего динамически объединить набор результатов с соответствующей таблицей на основе имени поля или столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...