2009-04-20 2 views
0

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

В заказе не может быть нескольких элементов, но значение заказа может быть нулевым, поэтому я хочу избежать ошибок разделения. (И нет, я никак не могу изменить базу данных.)

Каков наилучший способ сделать это? EDIT: Опущение нулевых итогов на самом деле прекрасное, поэтому принятый ответ.

SELECT order.customer, 
    SUM 
    (
    CASE items.color WHEN 'Green' THEN order.value 
    ELSE 0 END 
) * 100/sum(order.value) AS percentage, 
    SUM(order.value) AS total_value 
FROM orders 
    INNER JOIN item 
    ON order.item_id = item.item_id 
GROUP BY order.customer 

ответ

2

Добавить

having sum(order.value) <> 0 

После вашей группе

+0

Это может отфильтровывать некоторые заказы. – Quassnoi

+0

На самом деле, я думаю, было бы лучше сказать «Where order.value <> 0» - это будет отфильтровывать записи, устраняя необходимость в «наличии». –

+0

Это правда, но каковы шансы, что пользователь хочет увидеть отчет, где он показывает, что есть 0% зеленых предметов, проданных клиентам, которые не тратили на нас никаких денег? –

2
SELECT order.customer, 
    SUM 
    (
    CASE items.color WHEN 'Green' THEN order.value 
    ELSE 0 END 
) * 100/CASE sum(order.value) WHEN 0 THEN 1 ELSE SUM(order.value) END AS percentage, 
    SUM(order.value) AS total_value 
FROM orders 
    INNER JOIN item 
    ON order.item_id = item.item_id 
GROUP BY order.customer 
2

Вы можете просто отфильтровать заказы, где order.value = 0?

Where 
    order.value <> 0 
+0

Недостаточно, потому что сумма значений заказа для клиента может быть равна нулю –

+1

ОК, клиент покупает 10 зеленых виджетов, решает, что они слишком зеленые и возвращает их, идя туда, где можно купить светло-зеленые виджеты. Для этого клиента два заказа, ни один из которых не ноль, но при объединении для этого клиента добавьте в Zero. Как там «где order.value <> 0» помогает? –

+0

Хорошая точка. Спасибо за разъяснения. –

Смежные вопросы