将行与另一个表中2个日期之间的日期匹配

时间:2019-12-19 10:21:54

标签: sql sql-server tsql

我正在写一个查询,该查询计算是否为所有预订收取了正确的预订费。表的结构如下。请注意,由于工作环境的原因,我无法创建任何存储过程或函数来帮助我。

预订

Date date,
CustomerId int,
BookingTypeId int,
FeeCharged money

费用

BookingTypeId int,
FeeAmount money,
EffectiveFrom date

给定下面的示例数据集,我如何查询数据,以确保每次预订的费用都基于生效日期与费用表中的正确费用相匹配: example data

1 个答案:

答案 0 :(得分:2)

尝试

WITH
Fees (BookingTypeId, FeeAmount, EffectiveFrom) AS (
    SELECT 1, 50, '2019-06-01'
    UNION ALL SELECT 1, 55, '2019-09-01'
),
Bookings (Date, CustomerId, BookingTypeId, FeeCharged) AS (
    SELECT '2019-07-01', 1, 1, 50
    UNION ALL SELECT '2019-07-02', 1, 1, 50
    UNION ALL SELECT '2019-10-01', 1, 1, 150
),
BookingFeeUpdate as (
    SELECT
        Bookings.BookingTypeId,
        Bookings.Date,
        MAX(EffectiveFrom) LastFeeUpdate
    FROM
        Bookings
    LEFT JOIN Fees ON
        Fees.BookingTypeId = Bookings.BookingTypeId
        AND Fees.EffectiveFrom <= Bookings.Date
    GROUP BY
        Bookings.BookingTypeId,
        Bookings.Date
)
SELECT
    Bookings.*, Fees.FeeAmount as CorrectFee, Fees.EffectiveFrom, case Fees.FeeAmount when FeeCharged then 1 else 0 end Correct
FROM
    Bookings
INNER JOIN BookingFeeUpdate ON
    BookingFeeUpdate.BookingTypeId = Bookings.BookingTypeId
    AND BookingFeeUpdate.Date = Bookings.Date
LEFT JOIN Fees ON
    Fees.BookingTypeId = Bookings.BookingTypeId
    AND Fees.EffectiveFrom = BookingFeeUpdate.LastFeeUpdate
--WHERE Fees.FeeAmount <> Bookings.FeeCharged