适用于动态行和列的SQL Pivot,以及基于字段名的专用主表联接

时间:2019-04-15 07:46:00

标签: sql sql-server

我需要根据字段名称将动态数据透视表与其各自的表连接起来。 我有一个审核日志表,该表中的数据采用基于行的结构

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 |
  |------|--------|------|---------|--------|--------|--------------|

我知道如果我知道结果始终是通过加入User,Department和Employee表而来的,则可以进行加入。但是由于审计日志表还有其他表日志,所以我不确定哪种最佳方法是基于字段或列名将结果集与各自的表动态联接。

0 个答案:

没有答案