1

その日の実際の RATE と、その日に支払われるべきであった過去の RATE を比較する監査を実行しようとしています。

履歴から必要な情報を取得するために一時テーブルを作成し、これを PPDAUDIT と呼びました。これが監査SQLです

SELECT EMPLOYEE, PAY_SUM_GRP, HOURS, RATE, TR_DATE, DATE, CORRECT_RATE
FROM 
( 
SELECT  A.EMPLOYEE 
    , A.PAY_SUM_GRP
    , A.HOURS
    , A.RATE
    , A.TR_DATE
    , A.DATE 
    , CASE
        WHEN (MAX((B.BEG_DATE) < A.TR_DATE))
        AND B.FLD_NBR = '730'
        THEN B.N_VALUE/C.ANNUAL_HOURS
    END AS 'CORRECT_RATE'
FROM `PPDAUDIT` AS A 
    INNER JOIN `[dbo]_[hrhistory]`    AS B ON B.EMPLOYEE = A.EMPLOYEE
INNER JOIN `[dbo]_[employee]`     AS C ON C.EMPLOYEE = A.EMPLOYEE
WHERE A.RATE <> (B.N_VALUE/C.ANNUAL_HOURS) 
) AS D
WHERE CORRECT_RATE IS NOT NULL 

私が期待していたのは、それよりも前の履歴レコードでしたが、トランザクションの日付に最も近いものであり、履歴と移行が一致しなかったものだけを取得しました。それが引いたのは2番目に近いものでした。

例: トランザクションが 2012 年 1 月 1 日に発生し、2011 年 12 月 31 日、2011 年 10 月 10 日、および 2011 年 7 月 24 日の履歴がある場合、12 ではなく 10/10 の履歴に関連付けられたレートがプルされます。 /31 が必要です。

4

1 に答える 1

2

SQL Server 2008 では、 を使用outer applyして最新の履歴レコードを検索できます。たとえば、これは取引日より前の最後のレートを検索します。

select  *
from    TransactionUnderInvestigation tui
outer apply
        (
        select  top 1 *
        from    RateHistory rh
        where   rh.EmployeeId = tui.EmployeeId
                and RateStartDate <= tui.TransactionDate
        order by
                RateStartDate desc
        ) hist
于 2012-06-12T19:38:54.833 に答える