我一直在为一个具有以下表格结构的项目工作
开始 结束| 率 ------------------ 1 | 50 | 10 51 | 100 | 20 101 | 150 | 40 151 | 200 | 80 201 | 0 | 100
在这里,最后一个记录意味着200到无穷大的比率为100
在这里,我必须根据用户给定的起始值和终止值来计算总费率
我已经在mysql中尝试以下查询作为输入开始-30,结束-170
SELECT SUM((end+1 - start) * amount)
FROM table
WHERE start > 30
AND end < 170
它只给出第二和第三条记录值的总和,然后我必须分别查询第一条和最后一条记录。
如何在单个查询中实现?
假设我们声明了以下两个参数:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句