Избегайте вычисления нулевых значений во вложенном SQL-запросе. - PullRequest
0 голосов
/ 18 января 2019

У меня есть вычисление PostgreSQL, вычисляющее roi, где несколько значений select 100 * ((SUM(time_product)/SUM(rt_id_count))*SUM(rental_cost))/SUM(sale_count) определены и рассчитаны с инструкциями case как вложенные запросы. Однако, если какое-либо из значений пустое (например, если для элемента отсутствует rental_cost), оно вычисляет roi как zero, и это нулевое значение превращается в среднее значение, вычисляется, искажая среднее значение вниз. Как я могу рассматривать эти нули как нулевые в общем расчете?

(я вынул некоторые из вложенных запросов и заменил их на [calculation] в вопросе; это главным образом потому, что это очень длинный запрос, и я хочу отфильтровать шум и сделать всю структуру более заметной)

  (select 100 * ((SUM(time_product)/SUM(rt_id_count))*SUM(rental_cost))/SUM(sale_count)  FROM

  (select p2.id, p2.inventory_type, p2.working_value, COUNT(distinct p2.id),

  ----nested values calculated here
   (case p2.inventory_type 
      when 'set' then 
      [calculation A]
    else [calculation B] end) rental_cost,
    (case p2.inventory_type 
      when 'set' then 
      [caluculation A]
    else [calculation B]  end)   sale_count,
    (case p2.inventory_type 
      when 'set' then count(distinct rt.id)
      else 1 end 
      ) rt_id_count,
    (case p2.inventory_type 
      when 'set' then 
      [calculation ]  end)   time_total,
 [calculation]  time_product

  FROM warehouses w
    LEFT JOIN rfid_tags rt ON w.id = rt.location_id AND rt.location_type = 'Warehouse'
    LEFT JOIN products p2 ON rt.ancestor_product_id = p2.id 
    LEFT JOIN category_assignments ca  ON ca.product_id = p2.id
    LEFT JOIN categories c ON ca.category_id = c.id
    LEFT JOIN product_selections ps ON ps.rfid_tag_id = rt.id 

    WHERE 
      c.id=categories.id AND ca.primary = true  AND w.id=warehouses.id
      AND (select count(ps.id) from product_selections ps where ps.rfid_tag_id=rt.id)>0
      and p2.working_value>0 
    AND rt.location_id=w.id
    group by p2.id, p2.inventory_type, p2.working_value, c.sale_price_percentage, c.rental_price_percentage) Z) roi

1 Ответ

0 голосов
/ 18 января 2019

Используйте NULLIF для возврата NULL, если оба параметра равны:

SELECT NULLIF(?, 0);

где ? - ваше вычисление.

Это будет означать для вашего случая:

select nullif(100 * ((SUM(time_product)/SUM(rt_id_count))*SUM(rental_cost))/SUM(sale_count), 0)
from ...
...