在SQL中按值划分值

时间:2011-01-28 00:59:09

标签: sql mysql average

我试图将计算字段(在该示例中称为CALC_TIPS)除以给定某个COMM_TYPE_ID的计算字段的平均值。通过此查询,我可以为每个COMM_TYPE_ID提取AVG。

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 个答案:

答案 0 :(得分: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,以便您不会被零除错。

答案 1 :(得分: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

编辑:当然假设communication_id永远不为零:)