如何比较每一列并单独显示差异
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,了解一些改进问题的技巧。如何计划处理不同的数据类型,例如NewValue
和 OldValue
可能是 money
或 nvarchar(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 如果您觉得这有帮助,请随时接受答案。以上是关于如何比较每一列并单独显示差异的主要内容,如果未能解决你的问题,请参考以下文章