在mysql中计算总成本

1mrurvl1  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(278)

我有一个数据库表fuel,它有一个fid字段(primary,autoincrement)、vid(表示车辆id)、volume(表示以升为单位的燃油量)、price(表示每升燃油的成本)、meter(表示车辆在加注日期的当前里程表)、date(表示车辆正在加注的日期),供应商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

任何帮助都将不胜感激。

e4yzc0pl

e4yzc0pl1#

您只需要对查询做一个小的更改,就可以删除 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

对于您上一个问题的示例数据,这将给出以下结果。您可以通过以下方式检测每辆车的摘要行: nulldate 列,并按行显示总体摘要 nullvid 列。

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

演示
如果您对查看每辆车的各个条目不感兴趣,可以从列表中删除日期 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

输出(摘要行具有 null 为了 vid ):

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

演示

相关问题