Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 更新列中%的单元格_Sql Server_Tsql - Fatal编程技术网

Sql server 更新列中%的单元格

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

我的表格中有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        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