我一直在为一个具有以下表格结构的项目工作
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
仅给出第二名 和第三个记录值相加,然后我必须分别查询第一个和最后一个记录。
如何在单个查询中实现此目的?
答案 0 :(得分:1)
假设我们声明了以下两个参数:
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
然后我们可以减去这两个案例表达式来获得距离。如果您想要包含距离(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