根据距离范围计算费率

时间:2013-10-07 05:26:17

标签: php mysql sql range

我一直在为一个具有以下表格结构的项目工作

start | end | rate
------------------
   1  |  50 | 10
  51  | 100 | 20
 101  | 150 | 40
 151  | 200 | 80
 201  |   0 |100

这里最后一条记录意味着200到无限值的速率为100

在这里,我必须根据用户给出的起始值和结束值计算总费率

我在mysql中尝试了以下查询,用于输入start - 30,end - 170

SELECT SUM((end+1 - start) * amount) 
FROM table 
WHERE start > 30
AND end < 170

仅给出第二名 和第三个记录值相加,然后我必须分别查询第一个和最后一个记录。

如何在单个查询中实现此目的?

3 个答案:

答案 0 :(得分:1)

假设我们声明了以下两个参数:

set @start = 30, @end = 170;

首先获取属于您的范围(重叠)的行,我们会做(SQL Fiddle):

select start, end
from Table1
where start <= @end OR end >= @start

然后我们按下第一行和最后一行的范围的开始和结束。基本上我们将@start范围的第一部分和@endSQL 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

然后我们可以减去这两个案例表达式来获得距离。如果您想要包含距离(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以将其全部添加(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

答案 1 :(得分:1)

基于lc。的算法,你可以在MySQL中运行它:

SET @start = 30, @end = 170;

SELECT
  sum(rate * (least(`end`, @end) - greatest(start, @start) + 1)) TotalRate
FROM Table1
WHERE @end >= start OR @start <= `end`

答案 2 :(得分:0)

基于@lc Suggestion,以下查询适合我的期望

    SET @start=30, @end=170;
    SELECT SUM(rat*(CASE WHEN @end < end or end=0 THEN @end ELSE end END - CASE WHEN @start > start THEN @start ELSE start-1 END)) as price
    FROM rate
    WHERE start <= @end and (end >= @start or end=0)

此查询符合以下所有条件

当start-60,end-140然后数学将是(40*20)+(40*40)=2400

当start-230结束270时,数学将为(40*100)=400