mysql地址来自子查询的外部查询

时间:2014-09-04 11:32:07

标签: mysql select subquery

我有这个问题:

SELECT 
    sec_to_time(avg(t1.sessiontime)) as aloc,
    CONCAT(TRUNCATE(sum(t1.terminatecauseid = 1) * 100 / count(*),
                1),
            '%') as asr,
    count(*) as calls,
    cast(t1.destination as unsigned) as prefix,
    t2.destination as destination,
    SEC_TO_TIME(sum(t1.sessiontime)) as duration
FROM
    cc_call AS t1
        inner join
    cc_prefix as t2 ON t1.destination = t2.prefix
WHERE
    t1.card_id = '133' AND t1.starttime >= ('2014-06-1') AND t1.starttime <= ('2014-07-01 23:59:59') and t1.terminatecauseid = 1
group by t1.destination
order by duration DESC
LIMIT 0 , 25

t1.terminatecauseid = 1表示成功通话, 'asr'表示平均成功率,

我试图通过对扩展程序的总调用来查找有多少次调用(t1.terminatecauseid = 1)。

此行不起作用:

sum(t1.terminatecauseid = 1) * 100 / count(*)

因为我在WHERE子句中已经有了(t1.terminatecauseid = 1)。

我正在考虑放置一个子查询来检索总调用,其中count(*)当前是。

如何使用此查询计算总呼叫的ASR?

示例sqlfiddle

如果可能的话,我想显示持续时间= NULL的结果

1 个答案:

答案 0 :(得分:1)

使用条件聚合,如下所示:

SELECT sec_to_time(avg(case when t1.terminatecauseid = 1 then t1.sessiontime end)) as aloc,
       CONCAT(TRUNCATE(sum(t1.terminatecauseid = 1) * 100 / count(*),
               1),
             '%') as asr,
       count(*) as TotalCalls,
       sum(t1.terminatecauseid = 1) as Terminated1Calls,
       cast(t1.destination as unsigned) as prefix,
       t2.destination as destination,
       SEC_TO_TIME(sum(case when t1.terminatecauseid = 1 then t1.sessiontime end)) as duration
FROM cc_call t1 inner join
     cc_prefix t2
     ON t1.destination = t2.prefix
WHERE t1.card_id = '133' AND
      t1.starttime >= ('2014-06-1') AND t1.starttime <= ('2014-07-01 23:59:59') 
group by t1.destination
order by duration DESC
LIMIT 0 , 25;