Использование скользящего среднего для объединенных значений

Я не могу заставить вычисляемый столбец показывать среднее значение. Посмотри пожалуйста:

    Cast(AVG(COALESCE(mnth1.HandledCalls,0)+COALESCE(mnth2.HandledCalls,0)+COALESCE(mnth3.HandledCalls,0)) as Decimal(8,2))  as Avg_Handled,

Как сделать, чтобы это показывало среднее значение из 3 столбцов? Иногда mnth2 и mnth3 могут быть не заполнены. Я попытался разделить количество объединенных месяцев на случай, если какие-либо из них будут нулевыми в любой момент времени. Я получаю сообщение об ошибке, говорящее о том, что список выбора недействителен. Какие-либо предложения?


person ciw916    schedule 22.08.2013    source источник
comment
Можете ли вы добавить структуру таблицы к вашему вопросу?   -  person Declan_K    schedule 22.08.2013
comment
При расчете AVG с одним из столбцов, равным NULL, вы хотите, чтобы NULL рассматривался как ZERO, или вы хотите получить среднее значение только для двух других столбцов?   -  person Declan_K    schedule 22.08.2013
comment
Структура таблицы выбирает только mnth1, mnth2, mnth 3 и это среднее из доступных значений каждого из них. Я использую teradata 12. И когда значение null я хочу рассматривать так, как будто его не существует (он же среднее значение двух других столбцов)   -  person ciw916    schedule 22.08.2013


Ответы (3)


что-то вроде этого?

cast(
    sum(
        coalesce(mnth1.HandledCalls, 0) +
        coalesce(mnth2.HandledCalls, 0) +
        coalesce(mnth3.HandledCalls, 0)
    )
as decimal(29, 10)) /
(
    count(mnth1.HandledCalls) +
    count(mnth2.HandledCalls) +
    count(mnth3.HandledCalls)
)
person Roman Pekar    schedule 22.08.2013
comment
Это кажется таким... простым... Я проверю, когда вернусь за свой стол. Спасибо за ответ. - person ciw916; 22.08.2013
comment
На самом деле я не знаю, будет ли это работать в Teradata, но вы можете попробовать - person Roman Pekar; 22.08.2013

вы можете сделать что-то вроде

Cast(
     AVG((SELECT COALESCE(mnth1.HandledCalls,0) 
          UNION ALL SELECT COALESCE(mnth2.HandledCalls,0) 
          UNION ALL SELECT COALESCE(mnth3.HandledCalls,0) )) 
     AS  Decimal(8,2))  as Avg_Handled
person Luis LL    schedule 22.08.2013

Вы пробовали следующее:

SELECT CAST(AVG(ZEROIFNULL(mnth1.HandledCalls) 
     + ZEROIFNULL(mnth2.HandledCalls) 
     + ZEROIFNULL(mnth3.HandledCalls) as Decimal(8,2))  as Avg_Handled
FROM ....

По умолчанию значения NULL игнорируются агрегатными функциями в Teradata.

person Rob Paller    schedule 22.08.2013