Sql server 更新列中%的单元格
我的表格中有400万行,其中一个空白栏称为取消预订,分为3年,分别为2010年、2011年和2012年Sql server 更新列中%的单元格,sql-server,tsql,Sql Server,Tsql,我的表格中有400万行,其中一个空白栏称为取消预订,分为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
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天之间随机进行的
韦恩像下面这样的怎么样?它不是很漂亮,所以将其留给您作为练习,但基本上是沿着计算每种类型的数量的路线,然后对行数应用规则
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
声明@shareCancelled float、@shareSameDay float、@sharePrevDay float、@shareSevenDays float
选择@shareCancelled=0.08、@shareSameDay=0.20、@sharePrevDay=0.20、@shareSevenDays=0.20
声明@count int、@cancelled int、@sameDay int、@prevDay int、@sevenDays int
从预订中选择@count=count(*),其中DATEPART(Year,ArrivalDate)=“2010”和CanceledDate介于ArrivalDate和DepartureDate之间
选择@cancelled=@count*@shareCancelled,
@sameDay=@count*@shareCancelled*@shareSameDay,
@prevDay=@count*@shareCancelled*@sharePrevDay,
@sevenDays=@count*@shareCancelled*@shareSevenDays
选择ArrivalDate,
日期(日),
案例a.RowNum这是支持测试或类似活动的一次性活动吗?嗨,Chrisb,是的。
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