SQL Server - 需要 SQL 查询来识别/突出显示审核表中的特定更改

标签 sql sql-server sql-server-2005 sql-server-2008

假设我有一些数据存储在审计表中,其中主数据表上的触发器将所有发票记录更新写入此审计表。审计表包含以下数据:

InvoiceID CustomerID  ItemSold    AmountSold     SalesPerson  ModifyDate
1001      96          Widget      800            Robert       2001-1-1
1006      85          Thinger     350            Phil         2001-1-8
1001      96          Widget      800            Bobby        2001-1-9
1005      22          Widget      400            Robert       2001-1-10
1006      44          Thinger     500            Mike         2001-2-5
1001      96          Widget      250            Robert       2001-6-4

我想编写一个查询,每当 SalesPerson 字段发生变化时,对于任何特定的 InvoiceID(例如:每当销售员将销售更改为他的名字时)。

因此,在上面的示例中,我想确定 2001 年 1 月 9 日发生的更改,其中 InvoiceID 1001 的销售从 Robert 转移到 Bobby,以及 2001 年 6 月 4 日发生的更改从鲍比那里回到罗伯特……所以对该特定 ID 进行了两处更改。我还想确定 2001 年 2 月 5 日发生的变化,其中 InvoiceID 1006 的销售从 Phil 转至 Mike。

如何编写 SQL 查询来识别/突出显示这些更改?

该表当前不包含主键,但如果需要,我可以添加一个。

最佳答案

如果您添加主键(您应该这样做,从长远来看,这将使您在此表上需要的一些查询变得更容易) 那么你需要的是自加入。像这样的事情可能会做到这一点:

select a.invoiceId, a.SalesPerson as FirstSalesPerson, 
    a.Modifydate as FirstModifyDate, b.SalesPerson as SecondSalesPerson, 
    B.Modifydate as SecondModifyDate  
from myaudittable a
join myadudittable b
   on a.InvoiceID = b.InvoiceID
where a.AuditIDd <>b.AuditID and a.ModifyDate < b.ModifyDate
   and a.SalesPerson<>b.SalesPerson
order by InvoiceID

关于SQL Server - 需要 SQL 查询来识别/突出显示审核表中的特定更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3096866/

相关文章:

c# - 尝试恢复数据库中列的当前值时出错

mysql - 在 MySQL 中等同于 MS SQL 作业?

mysql - 从t-sql中的末尾获取字符串中第一次出现char的索引

sql - 我应该如何修改这个 SQL 语句?

sql - Oracle:如何使 "group by"超过一个范围?

sql - 在Perl中使用DBI在一行中更新多个字段?

sql-server-2005 - 管理网站 'event'数据库

sql-server - 为什么 SQL Server 上的查询速度慢而过程速度快?

sql - Oracle SQL 说 NULL 而不是 0 (ZERO)

sql-server - Getdate() 函数获取我的时区的日期