В SQL деление значения по его среднему значению - PullRequest
3 голосов
/ 28 января 2011

Я пытаюсь разделить вычисляемое поле (в примере оно называется CALC_TIPS) на среднее значение для этого вычисляемого поля с определенным COMM_TYPE_ID.С помощью этого запроса я могу извлечь AVG для каждого COMM_TYPE_ID.

SELECT AVG(CALC_TIPS), COMM_TYPE_ID
FROM (SELECT tips_amount/COMMUNICATIONS_ID AS CALC_TIPS, COMM_TYPE_ID
FROM consumer_action_log) AS cal
GROUP BY COMM_TYPE_ID;

Как мне тогда вернуться назад и разделить каждое значение в поле CALC_TIPS на среднее для его COMM_TYPE_ID?Я в настоящее время в растерянности.Заранее спасибо!

Примечание: я работаю с MySQL. Также примечание: я знаю, что подзапрос не нужен.Я использую этот запрос в качестве прокси для более сложного запроса, с которым я должен сделать то же самое.

Ответы [ 2 ]

1 голос
/ 28 января 2011

Два подзапроса делают это:

select cal1.calc_tips/cal2.avgCalc_Tips as theAnswer
  from (Select tips_amount/communication_id as calc_tips
             , comm_type_id
          from consumer_action_log)  cal1
  JOIN (select avg(tips_amount/communication_id) as avgCalcTips
             , comm_type_id
          from consumer_action_log
         group by comm_type_id    
          from consumer_action_log)  cal2
    ON cal1.comm_type_id = cal2.comm_type_id

РЕДАКТИРОВАТЬ: Предполагая, конечно, что Communication_id никогда не ноль

1 голос
/ 28 января 2011

Решение состоит в том, чтобы соединить производную таблицу с некоторыми данными по ключу COMMS_TYPE_ID.Неприлично, если как внешние, так и внутренние запросы являются многотабличными и большими.

SELECT tips_amount/COMMUNICATIONS_ID/NULLIF(AVG_TIP,0)
FROM consumer_action_log A   # return to table consumer_action_log
INNER JOIN (
    SELECT AVG(CALC_TIPS) AVG_TIP, COMM_TYPE_ID
    FROM (
        SELECT tips_amount/COMMUNICATIONS_ID AS CALC_TIPS, COMM_TYPE_ID
        FROM consumer_action_log) AS cal
    GROUP BY COMM_TYPE_ID
) B ON A.COMM_TYPE_ID = B.COMM_TYPE_ID

Причина, по которой NULLIF состоит в том, чтобы повернуть нули -> NULL, чтобы избежать ошибок деления на ноль.*

...