2013-02-21 136 views
2

我有4個百萬行我的表中有一個空白欄要求取消預訂分爲3個年份2010,2011和2012年更新列細胞%

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年我必須滿足下列條件

--Cancelled Bookings--

  • 在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 

你能幫忙嗎?

感謝

韋恩

+0

這是一個單關閉活動支持測試或類似? – chrisb 2013-02-21 16:47:42

+0

嗨克里斯,是的。 – wafw1971 2013-02-21 16:51:19

回答

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