Comparar el historial efectivo más cercano a la fecha de la transacción

Estoy intentando realizar una auditoría para comparar la TASA real del día con la TASA histórica que debería haberse pagado ese día.

Creé una tabla temporal para obtener la información necesaria del historial y la llamé PPDAUDIT. Aquí está el SQL de auditoría

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 

Lo que esperaba obtener era el registro histórico menos pero más cercano a la fecha de la transacción y luego solo obtener aquellos donde el historial y la transición no coincidían. Lo que tiró fue el segundo más cercano.

Ejemplo: si se produjo una transacción el 1/1/2012 y hay un historial el 12/31/2011, el 10/10/2011 y el 7/24/2011, extrae la tasa adjunta al historial el 10/10 en lugar del 12 /31 que se necesita.

preguntado el 12 de junio de 12 a las 19:06

¿Qué base de datos estás usando? (SqlServer/MySQL/Oracle/...) -

¿Y qué versión? (.../2005/2008/2012) -

Debo agregar que también intenté esto en nuestra base de datos MySQL, que en realidad es solo nuestro juego con la base de datos que es una copia de los datos de producción. Me encontré con el mismo problema. -

1 Respuestas

En SQL Server 2008, puede utilizar outer apply para buscar el último registro histórico. Por ejemplo, esto busca la última tasa antes de la fecha de la transacción:

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

Respondido el 12 de junio de 12 a las 20:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.