3

SQL Server 2005 を使用しています。

フィールドが変更されるたびに行のアーカイブを持つテーブルがあります。従業員ごとに変更されたフィールドを表示するレポートを作成する必要があります。

私のテーブルスキーマ:

tblEmp(empid, name, salary, createddate)

私のテーブルデータ:

Row 1: 1, peter, 1000, 11/4/2012
Row 2: 1, peter, 2000, 11/5/2012
Row 3: 1, pete, 2000, 11/6/2012
Row 4: 1, peter, 4000, 11/7/2012

従業員ピーター (従業員 ID 1) の上記のデータに基づくと、出力 (変更) は次のようになります。

結果セット:

1, oldsalary: 1000 newsalary: 2000 (changed on 11/5/2012)
1, oldname: peter newname: pete (changed on 11/6/2012)
1, oldname: pete newname: peter, oldsalary:2000, newsalary: 4000 (changed on 11/7/2012)

上記の結果セットを生成するSQLを考え出そうとしています。

このスレッドの最初の回答と同様のことを試みました:列フィールドの 2 つの行の違いを取得するにはどうすればよいですか?

しかし、それは一緒に来ていないので、誰かが助けてくれるかどうか疑問に思っています.

4

4 に答える 4

4

列ごとに違いを見ています。これは、 を使用することを示唆してunpivotいます。次の例では、列が変更されるたびに、以前の値と日付とともに出力が作成されます。

DECLARE @t TABLE(empid INT,name SYSNAME,salary INT,createddate DATE);

INSERT @t SELECT 1, 'peter', 1000, '20121104'
UNION ALL SELECT 1, 'peter', 2000, '20121105'
UNION ALL SELECT 1, 'pete',  2000, '20121106'
UNION ALL SELECT 1, 'peter', 4000, '20121107';


with cv as (
      select empid, createddate, col, val
      from (select empid, CAST(name as varchar(8000)) as name,
                   CAST(salary as varchar(8000)) as salary, createddate
            from @t
           ) t
      unpivot (val for col in (name, salary)) as unpvt
     ),
    cvr as (
     select cv.*,
            ROW_NUMBER() over (partition by empid, col order by createddate) as seqnum_all
     from (select cv.*, ROW_NUMBER() over (partition by empid, col, thegroup order by createddate) as seqnum_group
           from (select cv.*,
                        (ROW_NUMBER() over (partition by empid, col order by createddate) -
                         ROW_NUMBER() over (partition by empid, col, val order by createddate)
                        ) as thegroup
                 from cv
                ) cv
          ) cv
     where seqnum_group = 1
    ) -- select * from cvr
select cvr.*, cvrprev.val as preval, cvrprev.createddate as prevdate
from cvr left outer join
     cvr cvrprev
     on cvr.empid = cvrprev.empid and
        cvr.col = cvrprev.col and
        cvr.seqnum_all = cvrprev.seqnum_all + 1
于 2013-04-15T21:48:55.620 に答える
0

あなたの説明に基づいて, このテーブルが変更されたときにトリガーを作成してから, 期待する結果でテーブルを作成する方が簡単です. その瞬間に古い値と新しい値があるので, 問題はないはずです.期待どおりの結果が得られるようにします。

于 2016-06-28T01:30:53.893 に答える