Давайте предположим, что мы следующие два параметра объявлены:
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
Тогда мы можем вычесть эти два конкретных выражение, чтобы получить расстояние. И не забудьте добавить 1, если вы хотите включительно расстояние (SQL Fiddle):
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
вокруг всего выражения, чтобы добавить все это (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
Я правильно понимаю, что по мере того, как начало идет вверх, ставка повышается, поэтому, если вы начинаете с 30 и переходите к 170, тогда математика будет '(20 * 10) + (49 * 20) + (49 * 40) + (19 * 80) '? – Casey
Просьба поделиться фактической формулой для расчета скорости ... –
Вы правы, но с небольшой коррекцией математика будет
– Kanagu