没有正确别名的Sum值

时间:2017-08-24 13:21:06

标签: mysql sql sum

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

以下是相关查询的部分:

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列/值进行求和?

2 个答案:

答案 0 :(得分:1)

您将总通话数定义为入站,出站和未接来电的总和,但在您的查询中,您只包含了这3个词中的2个:

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

此外,使用COUNT可能不是您想要的。假设所有值都不是NULL,这只会计算记录数。相反,只需使用SUM总结三种类型的通话金额:

在计算总呼叫时使用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 :(得分:1)

首先,您需要在[longitude]="ConvertString(loc.location.lng)" 上使用SUM代替COUNT。 其次,如果你想使用别名,你需要将它全部包装在另一个total_calls中,如下所示:

SELECT