Мой запрос:
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
Просто удалите 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()
, если хотите получить конкретное значение в этом случае.
@ sk099. . . Нет. SUM()
игнорирует значения NULL
, поэтому ваши числа в сумме дадут 15.
Вы можете попробовать немного разбить запрос -
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.
Да, это характерно для Oracle.
если я что-то суммирую, то есть 1,2,3, null, 4,5, разве все это не будет равно нулю?