【发布时间】:2017-09-26 20:33:41
【问题描述】:
我正在尝试完成一个查询,以便在电话上为我们的人员计算不同的总数,并且我的标准总数似乎计算得很好,但我现在正在尝试这样做:
对于每个总列(总呼叫、总呼入、总呼出、总未接),我现在需要有一个与之合作的新列,用于我们数据库中的已知号码(所以我将知道总呼叫,总呼入已知, ETC。)。
我这样做的方法是检查session 表中的两个字段:callingpartyno 和finallycalledpartyno。因此,对于session 中的每个呼叫,我都需要检查其中任何一个字段中的数字是否在我的knownNumbers 表中的phone_number 字段中。如果是这样,我需要为已知列计算它们。
在下面的查询中大约有 8 行,我有我的第一个实例,它似乎显示了准确的数字,但它只包含callingpartyno。我首先需要知道在这种情况下如何组合条件 whento addfinallycalledpartyno 也是如此。
另一个问题是,对于入站和出站,我需要将我正在使用的电话号码字段基于 LEGTYPE 字段。因此,例如,如果我正在计算对已知号码的出站呼叫,我需要类似
sum(if(LEGTYPE1 = 1,1,0)) AND finallycalledpartno = k.phone_number AS Total_Outbound_known.
我希望这是有道理的,并且对于高级 SQL 程序员来说应该非常简单。在 case when 语句特别有效时,我似乎无法获得条件组合。
以下查询:
SELECT u.firstn
,u.lastn
,c.extension
,SUM(IF(LEGTYPE1 = 1, 1, 0)) + -- outbound calls
SUM(IF(LEGTYPE1 = 2, 1, 0) AND ANSWERED = 1) + -- inbound calls
SUM(IF(Answered = 1, 0, 1)) AS Total_Calls
,sum(case when CALLINGPARTYNO = k.phone_number then 1 else 0 end ) AS total_known
,sum(if(Answered = 1,0,1)) AS Total_Missed
,sum(if(LEGTYPE1 = 2,1,0) and ANSWERED = 1) AS Total_Recieved
,sum(if(LEGTYPE1 = 1,1,0)) AS Total_Outbound
,round(sum(Duration) / 60,2) AS Total_Talk_Time_minutes
,sum(if(Answered = 1,0,1)) / (SUM(IF(LEGTYPE1 = 1, 1, 0)) + -- outbound calls
SUM(IF(LEGTYPE1 = 2, 1, 0) AND ANSWERED = 1) + -- inbound calls
SUM(IF(Answered = 1, 0, 1))) * 100 AS Percentage_Missed
FROM ambition.session a
INNER JOIN ambition.callsummary b
ON a.NOTABLECALLID = b.NOTABLECALLID
INNER join ambition.mxuser c
ON a.RESPONSIBLEUSEREXTENSIONID = c.EXTENSIONID
INNER join jackson_id.users u
on c.extension = u.extension
left join ambition.knownnumbers k
on a.callingpartyno = k.phone_number
WHERE b.ts between curdate() - interval 5 day and now()
AND c.extension IN (7276,7314,7295,7306,7357,7200,7218,7247,7331,7255,7330,7000,7215,7240,7358,7312)
group by c.extension;
【问题讨论】:
-
那个 GROUP BY 无效。将在较新的 MySQL 版本上引发错误(除非在兼容模式下),并在旧版本中返回不可预测的数据。一般的 GROUP BY 规则说:“如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须要么标识一个分组列,要么是一个集合函数的参数。”
-
这就是我对这些数据运行查询数周的方式,它运行良好。当我删除它时,它只给我一行数据和一个 CSR 名称,但它包含 CSR 的所有累积总数。因此,我得到的不是 15 行的单独总计,而是一排的总计巨大
-
为了获得帮助,我建议发布示例数据和所需的输出
-
关于您为 Total_Outbound_known 提供的示例,我认为您可以使用以下内容:
SUM (CASE WHEN LEGTYPE1 = 1 AND finallycalledpartno = k.phone_number THEN 1 ELSE 0 END) AS Total_Outbound_known -
是的,谢谢@etsa,我一直在尝试这个约定,它似乎适用于所有事情,我仍然得到 0 表示出站已知,但我的其他总数匹配,所以看起来数字实际上可能是准确的。我只是在测试是否需要在此处添加到我的示例中。