Сумма с делом .. Предотвратить деление на ноль - PullRequest
0 голосов
/ 01 мая 2018

Мой запрос:

SELECT 
UPC,
SUM(
        CASE WHEN WEEK <= 13 THEN COST_AMOUNT ELSE 0 END
) /
SUM(
        CASE WHEN WEEK <= 13 THEN COST_QUANTITY ELSE 0 END
)

Возвращает деление на ноль, потому что если у upc нет данных для WEEK <= 13, то делитель будет равен нулю.

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

SELECT
UPC,
SUM(
    CASE WHEN WEEKS <= 13 
    THEN Cost_Amount 
    ELSE 0 END
) /
CASE WHEN 
    SUM(
        CASE WHEN WEEKS<=13 
        THEN Cost_Quantity 
        ELSE 0 END
    )=0 
THEN 1 
ELSE SUM(
        CASE WHEN WEEKS<=13 
        THEN Cost_Quantity 
        ELSE 0 END
    )
END

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Вы можете попытаться немного разбить запрос -

SELECT 
    UPC, 
    SUM_COST_AMOUNT / DECODE(SUM_COST_QTY,0,1,SUM_COST_QTY)
FROM 
(
    SELECT 
        UPC,
        SUM(
            CASE WHEN WEEK <= 13 THEN COST_AMOUNT ELSE 0 END
            ) AS SUM_COST_AMOUNT, 
        SUM(
            CASE WHEN WEEK <= 13 THEN COST_QUANTITY ELSE 0 END
            ) AS SUM_COST_QTY
    FROM .. 
    ..
    ..
    ..
)
0 голосов
/ 01 мая 2018

Просто удалите else в знаменателе:

SELECT UPC,
       (SUM(CASE WHEN WEEK <= 13 THEN COST_AMOUNT ELSE 0 END) /
        SUM(CASE WHEN WEEK <= 13 THEN COST_QUANTITY END)
       )

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

...