2

テーブルには 400 万行あり、2010 年、2011 年、2012 年の 3 年間に分割されたキャンセルされた予約と呼ばれる空白の列があります。

Booking_Skey BookingNumber ArrivalDate DepartureDate BookingDate CancelledDate BookingValue PitchType_Skey Site_Skey
      124532 B00124532      2010-12-31    2011-01-02  2010-12-31          NULL        10.00              7         2

私がする必要があるのは、更新したい年のキャンセル率を変更できるコードを作成することです。

したがって、2010年には次のものが必要です

--キャンセルされた予約--

  • 2010 年には、予約全体の 8% が​​キャンセルされます。キャンセル日は、到着日と同じかそれより短く、予約日と同じかそれよりも長くなる可能性があります。
  • 8%の20%は到着日と同じ日にキャンセルされます
  • 8%の20%が到着日の前日にキャンセルされます
  • 8% の 20% は、到着日の 7 日前にキャンセルされます。
  • 残りのキャンセルは、1 日から 90 日の間でランダム化されます

.

USE Occupancy
SELECT ArrivalDate, 
DATEADD(day, 
CASE WHEN Rand(CHECKSUM(NEWID())) BETWEEN 0 and 0.92 THEN NULL ELSE
CASE WHEN Rand(CHECKSUM(NEWID())) BETWEEN 0.92 and 0.94 THEN 0 ELSE
CASE WHEN Rand(CHECKSUM(NEWID())) BETWEEN 0.94 and 0.96 THEN -1 ELSE
CASE WHEN Rand(CHECKSUM(NEWID())) BETWEEN 0.96 and 0.98 THEN -7 ELSE
Round(Rand(CHECKSUM(NEWID())) * -90,0) END END END END, ArrivalDate) AS DaystoReduce 
FROM Bookings
WHERE DATEPART(Year,ArrivalDate) = '2010' and CancelledDate BETWEEN ArrivalDate AND DepartureDate

手伝ってくれますか?

ありがとう

ウェイン

4

1 に答える 1

0

以下のようなものはいかがでしょうか?あまりきれいではないので、演習として残しますが、基本的には、各タイプの数を計算し、行番号に対してルールを適用する方法に沿っています...

declare @shareCancelled float, @shareSameDay float, @sharePrevDay float, @shareSevenDays float
select @shareCancelled = 0.08, @shareSameDay = 0.20, @sharePrevDay = 0.20, @shareSevenDays = 0.20

declare @count int, @cancelled int, @sameDay int, @prevDay int, @sevenDays int
select @count = COUNT(*) from Bookings WHERE DATEPART(Year,ArrivalDate) = '2010' and CancelledDate BETWEEN ArrivalDate AND DepartureDate
select @cancelled = @count * @shareCancelled,
       @sameDay = @count * @shareCancelled * @shareSameDay,
       @prevDay = @count * @shareCancelled * @sharePrevDay,
       @sevenDays = @count * @shareCancelled * @shareSevenDays

select ArrivalDate,
DATEADD(day,
CASE WHEN a.RowNum <= @sameDay THEN 0
     WHEN a.RowNum <= @sameDay + @prevDay THEN -1
     WHEN a.RowNum <= @sameDay + @prevDay + @sevenDays THEN -7
     WHEN a.RowNum <= @cancelled THEN -(ABS(CAST(NEWID() AS binary(6)) %90) + 1)
     ELSE NULL END
, GETDATE()) as DaystoReduce 
from (
  select *, ROW_NUMBER() OVER(ORDER BY NEWID()) as RowNum from Bookings WHERE DATEPART(Year,ArrivalDate) = '2010' and CancelledDate BETWEEN ArrivalDate AND DepartureDate
) as a
于 2013-02-21T17:40:10.587 に答える