2015-07-25 1 views
0

У меня есть стол, в котором пробег транспортного средства, и пробег автомобиля сохраняется на регулярной основе.Подсчитайте пробег транспортных средств путем вычитания из показаний автомобиля

The table: 
---------- 
ID (primary key) 
Vehicle_id 
date_of_reading (datetime) 
Mileage 

К концу месяца я хочу, чтобы выбрать Последнее чтение прошлого месяца и вычесть его из последнего чтения этого месяца, чтобы получить Весь Km, что все транспортные средства, пройденные.

http://sqlfiddle.com/#!9/34b8b

Структура таблицы

CREATE TABLE `tbl_readings` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`vehicle_id` int(11) NOT NULL, 
`km_driven` int(11) NOT NULL, 
`dt_of_reading` datetime NOT NULL, 
    `dt_of_entry` datetime NOT NULL, 
    `entry_user` varchar(50) NOT NULL, PRIMARY KEY (`id`), 
    KEY `vehicle_id` (`vehicle_id`), CONSTRAINT `tbl_readings_ibfk_1`  FOREIGN KEY (`vehicle_id`) REFERENCES `table_vehicle_info` (`id`) ON DELETE  CASCADE ON UPDATE CASCADE) ENGINE=InnoDB AUTO_INCREMENT=394  DEFAULT CHARSET=latin1 

Почти каждый день показания счетчика транспортного средства, размещенные в этой таблице. И к концу месяца эти показания используются для расчета количества КМ, на которых управляют транспортные средства. Значение Km должно быть рассчитано с использованием последнего чтения предыдущего месяца и вычитания его из последнего показания текущего месяца.

Надеюсь, теперь намного яснее. Я понимаю, что мой вопрос был слишком неоднозначным.

+1

Пожалуйста, добавьте инструкции 'CREATE TABLE' для ваших таблиц. –

+1

@jpw, потому что это проще читать, чем текст, менее двусмысленный, чем естественный язык, и легче экспериментировать, если вы так склонны :) –

+0

Пожалуйста, отредактируйте свой вопрос с образцами данных и желаемыми результатами. Формулировка неоднозначна. –

ответ

0

Огромный жир отказ от ответственности: Это приходит с нет гарантии, но если я понял вашу проблему и я не ошибаюсь где-то, рассмотрим следующее.

Ваш стол будет

CREATE TABLE `foo` (`id` INTEGER, `date` DATE, `mileage` INT); 

Одним из возможных способами является первым создать представление с датой прошлого месяцем последнего чтение (который вы можете превратить в другую вложенную SELECT, если вы так склонны):

CREATE VIEW `past_month_readings` 
AS (SELECT `id`, 
    max(`date`) AS `latestreading` 
    FROM `foo` 
    WHERE MONTH(`date`) = MONTH(NOW())-1 
    GROUP BY `id`); 

Вслед за

SELECT `currentmileages`.`id`, `currentmileage`-`previousmileage` FROM 
(SELECT `foo`.`id`, `mileage` AS `currentmileage` 
    FROM `foo` 
    JOIN (SELECT `id`, MAX(`date`) AS `latestreading` FROM `foo` GROUP BY `id`) 
    AS `baz` 
    ON `foo`.`id` = `baz`.`id` 
    AND `foo`.`date` = `baz`.`latestreading` 
) 
AS `currentmileages` 
JOIN 
(SELECT `foo`.`id`, `mileage` AS `previousmileage` 
    FROM `foo` 
    JOIN `past_month_readings` 
    ON `foo`.`id`=`past_month_readings`.`id` 
    AND `foo`.`date` = `past_month_readings`.`latestreading`) 
AS `previousmileages` 
ON 
`currentmileages`.`id` = `previousmileages`.`id` 

Для

+------+------------+---------+ 
| id | date  | mileage | 
+------+------------+---------+ 
| 1 | 2015-06-15 | 1234 | 
| 1 | 2015-07-15 | 1444 | 
| 1 | 2015-07-25 | 2000 | 
| 2 | 2015-06-01 |  100 | 
| 2 | 2015-06-20 |  200 | 
| 2 | 2015-07-20 |  300 | 
+------+------------+---------+ 

это приводит к

+------+------------------------------------+ 
| id | `currentmileage`-`previousmileage` | 
+------+------------------------------------+ 
| 1 |        766 | 
| 2 |        100 | 
+------+------------------------------------+ 
0

У меня был тот же самый вопрос. Похоже, я решил это со следующим кодом:

SELECT Main.vehicle_id, Main.latestreading as currentmileage, Link.latestReadin as previousmilage 
FROM (SELECT m1.*, max(l1.rowid) as LinkID 
FROM `foo` as m1 
JOIN `foo` as l1 
ON l1.vehicle_id= m1.vehicle_id 
WHERE l1.date< m1.date 
GROUP BY m1.rowid 
ORDER BY m1.rowid desc) as Main 
LEFT JOIN (SELECT * FROM `foo`) as Link 
ON Link.rowid = Main.LinkID 
Смежные вопросы