如何比较每一列并单独显示差异

Posted

技术标签:

【中文标题】如何比较每一列并单独显示差异【英文标题】:How to compare each column and display the difference alone 【发布时间】:2021-07-10 18:16:54 【问题描述】:

请解释比较两行并将字段与更改值一起显示的最佳方法。

例子

ID EmployeeID EmployeeName Address1 Address2 Salary UpdatedDate
1 501 Johnson 2nd Ave 108 850 04/04/2020
2 501 Johnson 2nd Ave 109 900 04/05/2020
3 501 Johnson 3rd Ave 109 950 04/06/2020

每一行都是前一行的新版本。 根据输入值,需要比较上一行并突出显示差异。

示例: 输入:3

Column NewValue OldValue
Address1 3rd Ave 2nd Ave
Salary 950 900

输入:2

Column NewValue OldValue
Address2 109 108
Salary 900 850

字段名称应在比较时动态选择,并且应单独忽略主键和更新日期字段。

谢谢

【问题讨论】:

所有发布的都是程序描述。但是,我们需要您根据How to Ask 页面提出问题。我们无法确定您想从我们这里得到什么。请edit您的帖子包含一个我们可以回答的有效问题。提醒:通过访问help center,确保您知道这里的主题是什么;要求我们为您编写程序、建议和外部链接都是题外话。 请显示您当前拥有的代码,以便我们查看问题所在。 您能否在该表上创建一个触发器并将更改记录在单独的表中,例如THIS? 到目前为止您在这种情况下尝试过什么? 请阅读this,了解一些改进问题的技巧。如何计划处理不同的数据类型,例如NewValueOldValue 可能是 moneynvarchar(max)ID 是否保证是唯一且密集的,即从 1 开始并很好地计数?输入1 的答案是什么? 【参考方案1】:

这里有一个选项,它可以通过一点 JSON 动态地反透视您的数据。

示例或dbFiddle

;with cte as ( 
Select * 
      ,OldValue = lag(Value,1) over (partition by EmployeeID,[Key] order by UpdatedDate)
 From  YourTable A
 Cross Apply (
                Select [Key]
                      ,Value
                 From OpenJson((Select A.* For JSON Path,Without_Array_Wrapper,INCLUDE_NULL_VALUES  ) ) 
                 Where [Key] not in ('ID','UpdatedDate')
             ) B
)
Select [EmployeeID]
      ,[Column]=[Key]
      ,[NewValue] = [Value]
      ,[OldValue]
 From  cte
 Where [Value]<>[OldValue]
 Order By UpdatedDate desc

退货

EmployeeID  Column      NewValue    OldValue
501         Address1    3rd Ave     2nd Ave
501         Salary      950         900
501         Address2    109         108
501         Salary      900         850

【讨论】:

非常感谢。这正是我想要实现的。 @JackA 如果您觉得这有帮助,请随时接受答案。

以上是关于如何比较每一列并单独显示差异的主要内容,如果未能解决你的问题,请参考以下文章

按行进行单因素方差分析

如何比较两组数据的差异性?

如何比较两个表数据的差异

使用VBA循环遍历每一列并从大到小排序

PHP 脚本的安全性差异:嵌入 HTML 还是单独的文件?

使用python返回excel中两个不同文件中两列之间的差异