计算燃气里程

时间:2014-07-18 16:35:22

标签: mysql sql

我想跟踪从油箱到油箱的油耗(" MPG")。

这是我的Stops表:

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

这是我的Vendors表:

vendorID, int(11) auto_increment
vendor, varchar(32)
street, varchar(32)
city, varchar(32)
state, varchar(2)
zip, varchar(5)

这是我的Vehicles表:

vehicleID, int(11) auto_increment
year, year(4)
make, varchar(16)
model, varchar(16)
type, varchar(16)
vin, varchar(32)

到目前为止,我使用了以下查询(可行),我想添加一个计算的MPG列:

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列):

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

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

2 个答案:

答案 0 :(得分:0)

您将不得不使用自我加入。这个答案会告诉你一般的想法,但它没有经过测试,可能有错误。

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获取。

答案 1 :(得分:0)

根据我在问题评论中提出的建议,如果您向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加入/合并,以获取您需要的任何其他列。