2011-01-28 2 views
3

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

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 Также Примечание: я знаю, что подзапрос не нужен. Я использую этот запрос в качестве прокси для более сложного запроса, с которым мне нужно сделать то же самое.

ответ

1

Решение состоит в том, чтобы присоединить полученную таблицу к некоторым данным по ключу 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 является превращение 0 в -> NULL, так что вы не получите деление на ноль ошибок.

+0

Я запутался, что именно OTHERQUERY А представляет? Что бы запрос A был в моем текущем примере игрушек? Такая же производная таблица? – Spencer

+0

'Как я мог бы вернуться назад и разделить каждое значение в поле CALC_TIPS средним значением для его COMM_TYPE_ID? Он представляет собой то, что вы« возвращаетесь », – RichardTheKiwi

1

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

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 

EDIT: Предполагая, конечно, что communication_id не равно нуля :)