我想要跟踪我的汽油里程("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我已经尝试过寻找答案(堆栈溢出和mySQL文档中都有),但它们似乎都依赖于具有连续的ID值,或者以某种方式对特定列进行排序。由于我有多辆车和多个站点(不仅仅是remarks = 'Fuel'),这些解决方案不起作用。请随时提出任何问题以澄清,我将根据需要更新我的问题以提供更多信息。
发布于 2014-07-19 00:58:18
您将不得不使用自连接。这个答案将会告诉你大体的想法,但它是未经测试的,可能会有错误。
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获取。
发布于 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连接/合并,以获得所需的任何其他列。
https://stackoverflow.com/questions/24829925
复制相似问题