计算mysql中的总成本总和

时间:2018-05-31 01:45:17

标签: php mysql sql

我有一个数据库表 fuel ,它有一个fID字段(主要,自动增量),vID(用于车辆ID),数量(以升为单位的燃料量),价格(用于每升燃料),仪表(填充日期当前车辆里程表),日期(车辆装满日期),供应商ID(燃料供应商或车辆装满的地方),备注(关于车辆或燃料的任何附加说明)和类型(燃料等级)。

我想通过将体积(购买的升数)乘以价格(每升成本)然后加上特定车辆的所有燃料条目的总数来计算每次填充的燃料成本,然后最后添加表格中所有燃料条目的成本(fID是唯一的,但vID会重复出现(因为车辆会不时被填满)。

这就是我现在正在运行的,但它只返回每次填充的成本(不会累加其他填充)。

Select
   date_format(f1.date, '%y-%m-%y %H:%i:%s) as date,
   f1.meter as mileage,
   case when f2.meter is null then 0
           else f1.meter - f2.meter
           end as distance
   f1.fID,
   f1.volume,
   f1.volume * f1.price as cost
from
    fuel f1
left outer join
    fuel f2
On
  f2.date = (
                     select
                            max(date) 
                      from
                            fuel
                      where 
                             fuel.vID = f1.vID
                       and
                             fuel.date < f1.date
                  ) 
    where
          f1.ID = ? 
    Order by f1.date 

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

您只需对查询进行细微更改,删除WHERE子句并添加GROUP BY

SELECT f1.vid,
  DATE_FORMAT(f1.date, '%y-%m-%d %H:%i:%s') AS date, 
  f1.meter AS mileage,
  CASE WHEN f2.meter IS NULL THEN 0
       ELSE f1.meter - f2.meter
       END AS distance,
  f1.volume,
  SUM(f1.volume * f1.price) AS cost
FROM fuel f1
LEFT JOIN fuel f2
  ON f2.date = (SELECT MAX(date) 
                FROM fuel 
                WHERE fuel.vID = f1.vID AND fuel.date < f1.date)
GROUP BY f1.vid, f1.date WITH ROLLUP

对于来自您a previous question的样本数据,这会得到以下结果。您可以在null列中按date检测每辆车的摘要行,并在null列中按vid检测总体摘要行。

vid     date                mileage     distance    volume  cost
26      18-05-27 05:57:00   4500        0           25      18750
26      18-05-27 05:58:00   6000        1500        20      15000
26      (null)              6000        1500        20      33750
27      18-05-27 04:58:00   1200        0           15      18000
27      18-05-27 05:50:00   2000        800         5       5000
27      (null)              2000        800         5       23000
28      18-05-27 05:53:00   5000        0           15      12000
28      (null)              5000        0           15      12000
(null)  (null)              5000        0           15      68750

Demo

如果您对查看每辆车的各个条目不感兴趣,可以从GROUP BY中删除日期(以及选择中的日期特定变量)。此查询还将总和距离和音量:

SELECT f1.vid,
  SUM(CASE WHEN f2.meter IS NULL THEN 0
       ELSE f1.meter - f2.meter
       END) AS distance,
  SUM(f1.volume) as volume,
  SUM(f1.volume * f1.price) AS cost
FROM fuel f1
LEFT JOIN fuel f2
  ON f2.date = (SELECT MAX(date) 
                FROM fuel 
                WHERE fuel.vID = f1.vID AND fuel.date < f1.date)
GROUP BY f1.vid WITH ROLLUP

输出(摘要行nullvid}:

vid     distance    volume  cost
26      1500        45      33750
27      800         20      23000
28      0           15      12000
(null)  2300        80      68750

Demo