SUM with CASE .. Запретить деление на ноль

Мой запрос:

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
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
77
2

Ответы 2

Просто удалите 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(), если хотите получить конкретное значение в этом случае.

если я что-то суммирую, то есть 1,2,3, null, 4,5, разве все это не будет равно нулю?

Stephen K 01.05.2018 21:49

@ sk099. . . Нет. SUM() игнорирует значения NULL, поэтому ваши числа в сумме дадут 15.

Gordon Linoff 02.05.2018 03:14

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

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 .. 
    ..
    ..
    ..
)

Мы здесь говорим об Oracle? В противном случае DECODE() может не помочь OP.

sticky bit 02.05.2018 00:39

Да, это характерно для Oracle.

shrek 02.05.2018 00:43

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