Запрос на использование топлива с подзапросом - PullRequest
0 голосов
/ 22 октября 2019

Искал Stackoverflow, и не смог найти ответ на мой вопрос (возможно он там есть, но не видел ни одного).

Получите следующий запрос, в котором перечислены использованный пробег, стоимость топлива и количество топлива для нескольких транспортных средств, хранящихся в месте в таблице MAIN. Также есть подзапрос для расчета стоимости за милю - и в этом подзапросе есть предложение WHERE, которое не рассчитывается, если fuel_qty> 0 (не может делиться на ноль, если вы не Чак Норрис - ха-ха). Также необходимо отобразить ноль для fuel_qty (в строке 3 этого запроса), если это нулевое значение. Я получаю сообщение об ошибке с этим запросом, в котором говорится, что это "не групповая функция одной группы"Есть что-то, чего я пропускаю или не вижу?

Попытался добавить cost_per_mile в группу group by, но получил ошибку "неверный идентификатор". Затем также добавил в подзапрос предложение group by, но это также не сработало.

select cost.mileage_useage
     , cost.fuel_cost
     , cost.fuel_qty
     , (select (sum(cost1.mileage_usage / cost1.fuel_qty) * cost1.fuel_cost)
        from cost cost1
        where cost1.fuel_qty > 0) as cost_per_mile
from cost
inner join main on main.equip_no = cost.equip_no
where main.stored_loc = 4411
group by 
     cost.mileage_useage
   , cost.fuel_cost
   , cost.fuel_qty

Ответы [ 3 ]

0 голосов
/ 23 октября 2019

Поверьте, я нашел ответ - спасибо за вашу помощь! Это учитывает, если пробег равен 0 или отрицательное число. Также, если количество топлива = 0, тогда эту часть уравнения невозможно разделить на нулевое значение. Это может выглядеть немного странно, но это работает!

select cost.mileage_useage
     , cost.fuel_cost
     , cost.fuel_qty
     , ( sum(((CASE WHEN cost.mileage_usage = 0 THEN 1
         WHEN cost.mileage_usage < 0 THEN TO_NUMBER(NULL)
         ELSE cost.mileage_usage END) 
         / DECODE(eq_cost.fuel_qty,0, 1, eq_cost.fuel_qty)) 
         * eq_cost.fuel_cost )) as cost_per_mile
from cost
inner join main on main.equip_no = cost.equip_no
where main.stored_loc = 4411
group by cost.mileage_useage
      , cost.fuel_cost
      , cost.fuel_qty
0 голосов
/ 23 октября 2019

Вы можете еще больше упростить это следующим образом:

select cost.mileage_useage
     , cost.fuel_cost
     , cost.fuel_qty
     , sum((CASE WHEN cost.mileage_usage = 0 THEN eq_cost.fuel_cost
         WHEN cost.mileage_usage > 0 THEN cost.mileage_usage * eq_cost.fuel_cost END) 
         / (case when eq_cost.fuel_qty = 0 then 1 else eq_cost.fuel_qty end)) as cost_per_mile
from cost
inner join main on main.equip_no = cost.equip_no
where main.stored_loc = 4411
group by cost.mileage_useage
      , cost.fuel_cost
      , cost.fuel_qty;

Ура !!

0 голосов
/ 22 октября 2019

Почему это не делает то, что вы хотите?

select c.mileage_useage, c.fuel_cost, c.fuel_qty,
       (sum(c.mileage_usage) * c.fuel_cost /
        nullif(c.fuel_qty, 0)
       ) as cost_per_mile
from cost c inner join
     main m
     on m.equip_no = c.equip_no
where main.stored_loc = 4411
group by c.mileage_useage, c.fuel_cost, c.fuel_qty
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...