2017-08-24 79 views
0

我有一个查询正确地返回所有内容,除了我的总列(总和)之间存在一些轻微的不一致之外,我无法弄清楚它为什么会发生或者有更好的方法来处理它。没有正确别名的总和值

这里的查询的部分问题:

SELECT 
c.extension 
,RESPONSIBLEUSEREXTENSIONID 
, sum(Duration) -- seconds 
, round(sum(Duration)/60,2) -- minutes 
, sum(if(LEGTYPE1 = 1,1,0)) -- outbound 
, sum(if(LEGTYPE1 = 2,1,0) and ANSWERED = 1) -- inbound 
, sum(if(Answered = 1,0,1)) -- missed 
, count(if(LEGTYPE1 = 1,1,0)) + count(if(LEGTYPE1 = 2,1,0)) -- as total_calls 
, now() 
, b.ts 
FROM cdrdb.session a 
INNER JOIN cdrdb.callsummary b 
    ON a.NOTABLECALLID = b.NOTABLECALLID 
INNER join cdrdb.mxuser c 
    ON a.RESPONSIBLEUSEREXTENSIONID = c.EXTENSIONID 
    WHERE b.ts BETWEEN curdate() - interval 30 day and curdate() 
AND c.extension IN (7276,7314,7295,7306,7357,7200,7218,7247,7331,7255,7330,7000,7215,7240,7358,7312) 
group by DATE(b.ts),c.extension; 

这里是前几个结果:

enter image description here

总通话柱应该添加呼入,呼出和未接来电。你可以看到大多数情况下,总数是正确的,但特别是在第一和第三行中,它是关闭的。如果我给公式AS别名并尝试对别名进行求和,则表示该列不存在。

有什么我“米失踪是造成不一致的问题,更重要的是有一个更直接的方式,我可以总结这3列/值?

+0

使用'总和(LEGTYPE1 = 1)+ SUM(LEGTYPE1 = 2)'总通话,并添加' RESPONSIBLEUSEREXTENSIONID'在'group by'中。 –

回答

1

你总通话定义为呼入,呼出的总和,和未接来电,但在你的查询,你只包括这3项2:

count(if(LEGTYPE1 = 1,1,0)) + count(if(LEGTYPE1 = 2,1,0)) 

此外,使用COUNT有可能不是你打算什么这只是计数的记录数,假设所有值不是NULL。相反,只需使用对三种呼叫总和进行求和:

使用SUM,不COUNT,计算总通话时:

SUM(IF(LEGTYPE1 = 1, 1, 0)) +     -- outbound 
SUM(IF(LEGTYPE1 = 2, 1, 0) AND ANSWERED = 1) + -- inbound 
SUM(IF(Answered = 1, 0, 1)) AS total_calls  -- missed 
1

首先,你需要在total_calls使用SUM,而不是COUNT。 第二,如果你想使用别名,你需要用这一切在另一SELECT这样的:

SELECT 
*, 
(t.inbound + t.outbound) total_calls 
FROM 
(SELECT 
    c.extension, 
    RESPONSIBLEUSEREXTENSIONID, 
    sum(Duration) seconds, 
    round(sum(Duration)/60,2) minutes, 
    sum(if(LEGTYPE1 = 1,1,0)) outbound, 
    sum(if(LEGTYPE1 = 2,1,0) and ANSWERED = 1) inbound, 
    sum(if(Answered = 1,0,1)) missed, 
    now(), 
    b.ts 
    FROM cdrdb.session a 
     INNER JOIN cdrdb.callsummary b 
     ON a.NOTABLECALLID = b.NOTABLECALLID 
     INNER join cdrdb.mxuser c 
     ON a.RESPONSIBLEUSEREXTENSIONID = c.EXTENSIONID 
    WHERE b.ts BETWEEN curdate() - interval 30 day and curdate() 
    AND c.extension IN (7276,7314,7295,7306,7357,7200,7218,7247,7331,7255,7330,7000,7215,7240,7358,7312) 
    GROUP BY DATE(b.ts),c.extension) t;