首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算汽油里程

计算汽油里程
EN

Stack Overflow用户
提问于 2014-07-19 00:35:22
回答 2查看 1.4K关注 0票数 0

我想要跟踪我的汽油里程("MPG")从一个油箱到另一个油箱。

这是我的Stops表:

代码语言:javascript
运行
复制
stopID, int(11) auto_increment
vendorID, int(11)
vehicleID, int(11)
mileage, int(11)
date, date
gallons, float
cost, float
remarks, varchar(32)

这是我的Vendors表:

代码语言:javascript
运行
复制
vendorID, int(11) auto_increment
vendor, varchar(32)
street, varchar(32)
city, varchar(32)
state, varchar(2)
zip, varchar(5)

这是我的Vehicles表:

代码语言:javascript
运行
复制
vehicleID, int(11) auto_increment
year, year(4)
make, varchar(16)
model, varchar(16)
type, varchar(16)
vin, varchar(32)

到目前为止,我正在使用以下查询(它可以工作),我想在其中添加一个已计算的MPG列:

代码语言:javascript
运行
复制
SELECT v.vendorID, 
       v.vendor,  
       v.city,  
       v.state,  
       FORMAT(s.mileage , 0 ) Miles ,  
       DATE_FORMAT(s.date , '%m/%d/%y' )  Date ,  
       FORMAT(s.gallons , 3 ) Gal ,  
       FORMAT(s.cost , 2 ) Cost ,  
       FORMAT(s.cost /s.gallons , 3 ) Rate 
FROM Stops s 
INNER JOIN Vendors v  
       ON s.vendorID =v.vendorID  
       AND s.remarks ='Fuel'  
       AND s.vehicleID =2  
       AND s.date >= '2014-07-01'
ORDER BY `Date`  DESC

以下是现有查询(不含MPG列)的典型输出:

代码语言:javascript
运行
复制
vendorID    vendor  city        state   Miles   Date        Gal     Cost    Rate    (MPG)
14          Sunoco  Arnold      MD      122,104 07/18/14    3.741   15.22   4.068
14          Sunoco  Arnold      MD      121,936 07/16/14    3.633   14.89   4.099
14          Sunoco  Arnold      MD      121,770 07/14/14    3.276   13.43   4.100
29          BP      Washington  DC      121,620 07/11/14    3.635   15.26   4.198

我已经尝试过寻找答案(堆栈溢出和mySQL文档中都有),但它们似乎都依赖于具有连续的ID值,或者以某种方式对特定列进行排序。由于我有多辆车和多个站点(不仅仅是remarks = 'Fuel'),这些解决方案不起作用。请随时提出任何问题以澄清,我将根据需要更新我的问题以提供更多信息。

EN

回答 2

Stack Overflow用户

发布于 2014-07-19 00:58:18

您将不得不使用自连接。这个答案将会告诉你大体的想法,但它是未经测试的,可能会有错误。

代码语言:javascript
运行
复制
select (ThisStop.mileage - PreviousStop.mileage) / ThisStop.gallons mpg
from stops.ThisStop join stops.PreviousStop on ThisStop.vehicleId = PreviousStop.vehicleId
where PreviousStop.date = 
(select max(date) from stops
where vehicleId = ThisStop.vehicleId
and date < ThisStop.date)

如果您想要识别供应商,请从PreviousStop获取。

票数 0
EN

Stack Overflow用户

发布于 2014-07-19 01:35:04

按照我在问题注释中提出的建议,如果你在Stops中添加一个自引用列,那么解决方案将会容易得多,而不需要维护任何顺序:

Stops表将为:

stopID, int(11) auto_increment vendorID, int(11) vehicleID, int(11) mileage, int(11) date, date gallons, float cost, float remarks, varchar(32) previous_stopID int(11)

而获取MPG的查询将是:

SELECT cur.stopID, cur.vendorID, (cur.mileage-prev.mileage)/cur.gallons as MPG FROM Stops cur INNER JOIN Stops prev WHERE cur.prev_StopID = prev.stopID

然后,您可以将其与Vendors连接/合并,以获得所需的任何其他列。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24829925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档