【问题标题】:Need T-SQL help in Sql Server 2005在 Sql Server 2005 中需要 T-SQL 帮助
【发布时间】:2012-03-05 15:57:22
【问题描述】:

我有两个表EmployeeEmployeeLog(除了LogCreatedDate 之外的列相同)

列是这样的:

EmployeeID, EmployeeName, LastModifiedBy, ModifiedDate,
ColumnA, ColumnB, ColumnC bla-bla-bla

我需要 T-SQL,它可以提供如下表所示的输出。

结果集 1:

在每次 Employee 表更新时,我都会在 EmployeeLog 表中插入一个具有当前值的新行。

EmployeeLog 表为每个EmployeeID 包含多行,因此我需要修改列中的先前值和当前值。

所以我的第一步是通过LogCreatedDate DESC 获取TOP 2 记录顺序。现在我应该怎么做才能获得如表所示的输出?

结果集 2:

谢谢

【问题讨论】:

  • 我有 LogCreatedDate DESC 的 TOP 2 记录顺序,现在如何比较这两行并按照图中所示的表格进行排列

标签: asp.net sql-server-2005 tsql


【解决方案1】:

试试这个:

DECLARE @EmployeeLog TABLE
(
    EmployeeID int,
    EmployeeName varchar(50),
    LastModifiedBy varchar(50),
    ModifiedDate datetime,
    ColumnA varchar(50),
    ColumnB varchar(50),
    ColumnC varchar(50),
    LogCreatedDate datetime
)

INSERT INTO @EmployeeLog VALUES (1, 'A', 'A', '2012-02-07', 'A', 'B', 'C', '2012-02-07')
INSERT INTO @EmployeeLog VALUES (1, 'B', 'B', '2012-02-06', 'AA', 'BB', 'CC', '2012-02-06')

;
WITH    Basics AS
(
        SELECT  *, ROW_NUMBER() OVER (ORDER BY LogCreatedDate DESC) as Entry
        FROM    @EmployeeLog 
),      PivotTable AS
(
        SELECT  EmployeeID,
                LastModifiedBy,
                ModifiedDate,
                'ColumnA' ColumnName,
                ColumnA ColumnValue,
                LogCreatedDate,
                Entry
        FROM Basics
        UNION ALL
        SELECT  EmployeeID,
                LastModifiedBy,
                ModifiedDate,
                'ColumnB' ColumnName,
                ColumnB ColumnValue,
                LogCreatedDate,
                Entry
        FROM Basics
        UNION ALL
        SELECT  EmployeeID,
                LastModifiedBy,
                ModifiedDate,
                'ColumnC' ColumnName,
                ColumnC ColumnValue,
                LogCreatedDate,
                Entry
        FROM Basics
)
SELECT  [Current].LastModifiedBy, [Current].ModifiedDate,
        Previous.EmployeeID, Previous.ColumnName,
        Previous.ColumnValue [Previous Value],
        [Current].ColumnValue [Current Value]
FROM    PivotTable Previous
JOIN    PivotTable [Current]
    ON  Previous.EmployeeID = [Current].EmployeeID AND
        Previous.ColumnName = [Current].ColumnName AND
        Previous.Entry = [Current].Entry + 1

【讨论】:

  • 非常感谢鲁本斯。非常感谢。它真的帮助了我。它太棒了。它完全符合我的需要。为您的回复 +1。
  • 我还有一件事要做,现在我想过滤掉这个结果集,这样它就应该只显示那些改变了列值的记录,即消除具有相同先前值和当前值的记录
  • 请参阅我的问题中的结果集 2 以供参考。所以现在它应该过滤掉 rowno 1 & 3 NOT 2。
猜你喜欢
  • 2011-07-10
  • 2010-10-13
  • 1970-01-01
  • 2017-09-28
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多