我想跟踪从油箱到油箱的油耗(" 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'),这些解决方案都不起作用。请随时提出任何问题要澄清,我会根据需要更新我的问题以提供其他信息。
答案 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
加入/合并,以获取您需要的任何其他列。