Расчет общей суммы стоимости в MySQL

У меня есть таблица базы данных топливо, в которой есть поле fID (первичный, автоинкремент), vID (для идентификатора транспортного средства), объем (для количества топлива в литрах), цена (для стоимости топлива за литр), метр (для текущего одометр транспортного средства на дату заправки), дата (дата заправки транспортного средства), vendorID (для поставщика топлива или только место заправки транспортного средства), примечания (любые дополнительные примечания к транспортному средству или топливу) и тип (марка топлива).

Я хочу сделать запрос, который рассчитал бы стоимость топлива на каждую заправку, умножив объем (купленные литры) на цену (стоимость за литр), затем добавив общую сумму для всех топливных записей для конкретного автомобиля, а затем, наконец, добавив стоимость все записи о топливе в таблице (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 

Любая помощь будет принята с благодарностью.

У вас были образцы данных, но вы не поделились? Бу!

Strawberry 31.05.2018 07:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
884
1

Ответы 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

Для образцов данных из вашего предыдущий вопрос это дает следующий результат. Вы можете определить итоговые строки для каждого транспортного средства по 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

Демо

Если вас не интересует просмотр отдельных записей для каждого транспортного средства, вы можете удалить дату из 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

Демо

Это именно то, что я хотел. Итак, как я могу получить эту итоговую строку (Null vid) для отображения в представлении в html?

Kingsley 31.05.2018 06:38

Другое дело, как я могу дополнительно изменить запрос, чтобы он возвращал итоги (сводку) за любой период времени ... Скажите, хочу ли я сводку общей стоимости топлива за последний месяц или прошлую неделю или последние 20 дней, как я могу заставить это работать?

Kingsley 31.05.2018 06:43

В первом запросе есть несколько сомнительная функциональная зависимость, поэтому второй запрос кажется более подходящим.

Strawberry 31.05.2018 07:24

@Kingsley, итоговая строка будет последней строкой, которую вы получите, если вы зациклите fetch () в PHP. Чтобы получить результаты за определенный период времени, используйте что-то вроде WHERE f1.date >= CURDATE() - INTERVAL 20 DAY непосредственно перед предложением GROUP BY. демонстрация

Nick 31.05.2018 09:36

@ Strawberry, о чем вы говорите?

Nick 31.05.2018 09:36

Другие вопросы по теме