根据先前计算的字段计算MySQL Select字段

时间:2018-07-31 05:15:40

标签: mysql sql subquery inner-join

因此,我在MySQL中有一个电话客户数据库,该数据库有两个表customer_mastercall_data。两个表都有一个customer_id字段,该字段将具有特定属性的单个客户编号匹配。 customer_master表包含客户名称,call_data具有大量与唯一客户ID相关联的呼叫数据。我需要创建一个查询,其中查询尝试的本地呼叫的数量,然后根据呼叫事件获得成功拨打的本地电话(不是掉线的电话)的数量并计算平均值。 call_data表有一个call_event字段,在这里我基本上需要查找两个不同的东西a)local_call_failurelocal_call_success。我可以创建一个查询,在其中可以使用inner joinuserIDuser name来显示我的表格,但是我不知道然后如何使用该计算出的尝试值来计算本地呼叫成功平均值。这是通过基于total local attempts挑选本地电话来获得总尝试次数的方法:

call_event

现在,我可以创建另一个查询来计算使用与上面相同的想法进行的成功本地呼叫总数,除了SELECT customer_id, CONCAT(name_first, ' ', name_last) AS 'Customer Name', COUNT(CM.call_event) AS 'Total Local Attemps' FROM customer_master CM INNER JOIN call_data CD ON CM.customer_id = CD.customer_id AND ((call_event = 'local_call_failure') OR (call_event = 'local_call_success') ) GROUP BY customer_id; 语句中,只包括AND。如果我能以某种方式弄清楚如何独立执行这些操作,然后仅将call_event = 'local_call_success'除以计算平均值,那便是我所需要的!用任何其他语言,这将花费我一个循环和五分钟,但是SQL似乎要困难得多。我需要在同一个查询中完成两个计算,并将它们并排打印出来,然后再对平均值进行计算。如何做到这一点?根据我的能力,设置一个像call_success/tota_call_attempts这样的变量,然后在您的@var_name := COUNT(CM.call_event)语句中使用该变量再次执行计算在SQL中是不行的。

有人可以帮我吗?我将永远在你的债务中!

2 个答案:

答案 0 :(得分:1)

使用sql server语法,我相信它将非常接近相同:

select customer_id, CONCAT(name_first, ' ', name_last) AS 'Customer Name', 
COUNT(CM.call_event) AS 'Total Local Attemps',
sum(case when call_event = 'local_call_success' then 1 else 0 end) as 'Success Events',
sum(case when call_event = 'local_call_success' then 1 else 0 end)/COUNT(CM.call_event) as SuccesstRate
from customer_master CM
INNER JOIN call_data CD ON CM.customer_id = CD.customer_id
AND ((call_event = 'local_call_failure')
    OR (call_event = 'local_call_success')
    )
group by customer_id;

答案 1 :(得分:1)

在MySQL中,您可以执行以下操作:

select cm.customer_id,
       concat(cm.name_first, ' ', cm.name_last) AS `Customer Name`, 
       count(*) as total_attempts,
       sum( cd.call_event = 'local_call_failure' ) as num_failures,
       sum( cd.call_event = 'local_call_failure' ) / count(*) as failure_rate
from customer_master cm join
     call_data cd 
     on cm.customer_id = cd.customer_id and
        cd.call_event in ('local_call_failure', 'local_call_success')
group by customer_id, `Customer Name`;