假设我们声明了以下两个参数:
set @start = 30, @end = 170;
首先要获得属于您范围内的行(重叠),我们会这样做(SQL Fiddle):
select start, end
from Table1
where start <= @end OR end >= @start
然后我们按摩第一行和最后一行的范围的开始和结束。基本上,我们将范围的第一部分和范围@start
的第二部分限制在@end
(SQL Fiddle):
select CASE WHEN @start > start THEN @start ELSE start END AS start,
CASE WHEN @end < end THEN @end ELSE end END AS end
from Table1
where start <= @end OR end >= @start
然后我们可以将这两个case表达式相减得到距离。如果您想要包含距离(SQL Fiddle),请不要忘记添加 1:
select CASE WHEN @end < end THEN @end ELSE end END - CASE WHEN @start > start THEN @start ELSE start END + 1 AS dist
from Table1
where start <= @end OR end >= @start
乘以比率。这次不要忘记括号,因为乘法优先(SQL Fiddle):
select rate * (CASE WHEN @end < end THEN @end ELSE end END - CASE WHEN @start > start THEN @start ELSE start END + 1)
from Table1
where start <= @end OR end >= @start
最后,SUM
在整个表达式周围加上 a 以将其全部加起来(SQL Fiddle):
select SUM(rate * (CASE WHEN @end < end THEN @end ELSE end END - CASE WHEN @start > start THEN @start ELSE start END))
from Table1
where start <= @end OR end >= @start