【问题标题】:MySQL table value difference related to current date and previous dateMySQL表值与当前日期和前一个日期相关的差异
【发布时间】:2020-03-09 10:45:49
【问题描述】:

我有一些用于管理车辆详细信息的表格。相关表格如下:

store_item

+---------+-----------+--------+
| item_id | item_name | status |
+---------+-----------+--------+
|       1 | Diesel    |      1 |
|       2 | Petrol    |      1 |
+---------+-----------+--------+

tbl_vehicle

+------------+---------------+
| vehicle_id | registered_no |
+------------+---------------+
|          1 | LE-7476       |
|          2 | 270-0523      |
+------------+---------------+

tbl_direct_fuel

+----------------+----------+---------+------------+------------+
| direct_fuel_id | vehicle  | orderNo | issue_date | milo_meter |
+----------------+----------+---------+------------+------------+
|              1 | LE-7476  |  173072 | 2019-11-12 |    30,000  |
|              2 | LE-7476  |  173069 | 2019-11-08 |    29,600  |
|              3 | LE-7476  |  173059 | 2019-11-05 |    29,000  |
|              4 | LE-7476  |  173055 | 2019-10-08 |    25,000  |
|              5 | 270-0523 |  173068 | 2019-11-02 |    10,000  |
|              6 | 270-0523 |  173067 | 2019-10-02 |     8,500  |
+----------------+----------+---------+------------+------------+

tbl_direct_fuel_details

+------------------------+----------------+------+----------+------------+
| direct_fuel_details_id | direct_fuel_id | item | fuel_qty | fuel_price |
+------------------------+----------------+------+----------+------------+
|                    100 |              1 |    1 |       20 |        105 |
|                    101 |              2 |    1 |       15 |        105 |
|                    102 |              3 |    1 |       12 |        105 |
|                    103 |              4 |    2 |       50 |        165 |
|                    104 |              5 |    1 |       25 |        100 |
|                    105 |              6 |    2 |       18 |        165 |
+------------------------+----------------+------+----------+------------+

期望的输出

我想获得 no_of_kms,而不是使用 issue_date 和 milo_meter(当前 milo_meter - 以前的 milo_meter)发布的燃料数量。输出如下:

+----------+-----------+
| vehicle  | no_of_kms |
+----------+-----------+
| LE-7476  |      400  |
| LE-7476  |      600  |
| LE-7476  |    4,000  |
| 270-0523 |     1500  |
+----------+-----------+

我使用了以下查询:

select v1.registered_no as vehicle, si.item_name as fuel, df.milo_meter - df.milo_meter  as no_of_kms
from (select dfd.item, sum(dfd.fuel_qty) AS qty
      from tbl_direct_fuel df
      join tbl_direct_fuel_details dfd on df.direct_fuel_id = dfd.direct_fuel_id
      join tbl_vehicle v1 on df.vehicle = v1.vehicle_id
      where df.status = 1
      group by registered_no) dfd
join store_item si on dfd.item = si.item_id
join (select item, sum(dfd.fuel_qty) AS fuel_qty
      from tbl_direct_fuel_details
      group by item) dfd on si.item_id=dfd.item

但是上面的查询没有正常工作。可能出了什么问题?谁能帮帮我?

【问题讨论】:

    标签: mysql sql database date window-functions


    【解决方案1】:

    如果您运行的是 MySQL 8.0,您可以简单地使用窗口函数 lag()

    select *
    from (
        select
            issue_date,
            vehicle,
            milo_meter 
                - lag(milo_meter) over(partition by vehicle order by issue_date) no_of_kms 
        from tbl_direct_fuel
    ) t
    where no_of_kms is not null
    order by vehicle desc, issue_date desc
    

    我在输出列中添加了issue_date,因为这似乎是理解结果的明智信息。


    在早期版本中,我认为内联查询可能会解决问题:

    select *
    from (
        select
            issue_date,
            vehicle,
            milo_meter - (
                select max(milo_meter) 
                from tbl_direct_fuel d1
                where d1.vehicle = d.vehicle and d1.issue_date < d.issue_date
            ) no_of_kms 
        from tbl_direct_fuel d
    ) t
    where no_of_kms is not null
    order by vehicle desc, issue_date desc
    

    这假设给定车辆的milo_meter 只能增加,这似乎是一个合理的假设。

    Demo on DB Fiddle

    两个查询都返回:

    问题日期 |车辆 | no_of_kms :--------- | :------- | --------: 2019-11-12 | LE-7476 | 400 2019-11-08 | LE-7476 | 600 2019-11-05 | LE-7476 | 4000 2019-11-02 | 270-0523 | 1500

    【讨论】:

    • @GMB。但是我的项目是基于 MySQL 5.* 的。不能使用函数 lag()
    • @mcode:我用 MySQL 早期版本的解决方案更新了我的答案。
    • @GMB。但出现以下错误。 MySQL 说:文档 #1054 - '字段列表'中的未知列 'issue_date'
    • @mcode:对不起,我输入了错误的表名(tbl_direct_fuel_details 而不是tbl_direct_fuel)。固定。
    猜你喜欢
    • 2016-06-22
    • 2019-04-24
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多