2017-08-24 69 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;