通过分组聚合,而不仅仅是一个总计记录

时间:2017-10-31 19:06:46

标签: mysql sql

我在下面有一个查询,它应该是CSR代理使用其扩展程序累计的数字。目前,它为一个代理及其分机返回一行/一条记录,但它显示了该一条记录上所有15个代理的正确总数。

然而,我想要的是它列出每个代理及其分机与当天各自的总数。我是按照扩展程序进行分组,但它似乎无法解决问题。

我的查询中是否有某些内容会成为每个扩展程序/代理程序不会破坏总计数的原因?

SELECT  firstn
, lastn
, extension
, Recieved
, RecievedKnown
, Outbound
, outboundKnown
, Missed
, MissedKnown
, duration
, HOLDTIMESECS


    FROM (
  SELECT firstn
   , lastn
   , c.extension
   , sum(CASE WHEN LEGTYPE1 = 2 AND ANSWERED = 1 THEN 1 ELSE 0 END) AS Recieved
   , sum(case when LEGTYPE1 = 2 and answered = 1 and CALLINGPARTYNO = k.phone_number then 1 ELSE 0 end) as RecievedKnown
   , sum(CASE WHEN ANSWERED = 1 AND LEGTYPE1 = 1 then 1 ELSE 0 end)  AS Outbound
   , sum(case when LEGTYPE1 = 1 and FINALLYCALLEDPARTYNO = k.phone_number then 1 ELSE 0 end) as outboundKnown
   , sum(case when Answered = 0 then 1 ELSE 0 end) as Missed
   , sum(case when ANSWERED = 0 and CALLINGPARTYNO = k.phone_number then 1 ELSE 0 end)   as MissedKnown
   , sum(b.duration) as duration
   , sum(a.holdtimesecs) as holdtimesecs


  FROM ambition.session a
  INNER JOIN ambition.callsummary b ON a.NOTABLECALLID = b.NOTABLECALLID
  right join jackson_id.users c on a.callingpartyno = c.extension or a.finallycalledpartyno = c.extension
  LEFT JOIN ambition.known_numbers k ON a.callingpartyno = k.phone_number
  WHERE a.ts >= curdate()

  and(a.CALLINGPARTYNO in (select extension from ambition.ambition_users) OR a.finallycalledpartyno IN (select extension from ambition.ambition_users))
  ) x
  group by extension;

1 个答案:

答案 0 :(得分:2)

子查询中需要您的GROUP BY子句。此外,我怀疑您可以使用FROM jackson_id.users c来避免正确的加入。此外,您正在使用左连接到ambition.known_numbers k,但许多案例表达式依赖于该表中的非空值。连接应该是内连接,或者您需要在这些case表达式中满足该表中的NULL。

SELECT
        firstn
      , lastn
      , extension
      , Recieved
      , RecievedKnown
      , Outbound
      , outboundKnown
      , Missed
      , MissedKnown
      , duration
      , HOLDTIMESECS
FROM (
        SELECT
              firstn
            , lastn
            , c.extension
            , sum(CASE WHEN LEGTYPE1 = 2 AND ANSWERED = 1 THEN 1 ELSE 0 END) AS Recieved
            , sum(case when LEGTYPE1 = 2 and answered = 1 and CALLINGPARTYNO = k.phone_number then 1 ELSE 0 end) as RecievedKnown
            , sum(CASE WHEN ANSWERED = 1 AND LEGTYPE1 = 1 then 1 ELSE 0 end)  AS Outbound
            , sum(case when LEGTYPE1 = 1 and FINALLYCALLEDPARTYNO = k.phone_number then 1 ELSE 0 end) as outboundKnown
            , sum(case when Answered = 0 then 1 ELSE 0 end) as Missed
            , sum(case when ANSWERED = 0 and CALLINGPARTYNO = k.phone_number then 1 ELSE 0 end)   as MissedKnown
            , sum(b.duration) as duration
            , sum(a.holdtimesecs) as holdtimesecs
        FROM jackson_id.users c
        INNER JOIN ambition.session a  on c.extension = a.callingpartyno or c.extension = a.finallycalledpartyno
        INNER JOIN ambition.callsummary b ON a.NOTABLECALLID = b.NOTABLECALLID
        LEFT JOIN ambition.known_numbers k ON a.callingpartyno = k.phone_number
        WHERE a.ts >= curdate()
              AND(a.CALLINGPARTYNO in (select extension from ambition.ambition_users) 
               OR a.finallycalledpartyno IN (select extension from ambition.ambition_users)
                 )
        GROUP BY
              firstn
            , lastn
            , c.extension
      ) x
;

就我个人而言,我从未热衷于依赖序列(a,b,c ......)的表别名,因为该序列可能不会保持稳定。相反,我更喜欢这可能的第一个字母。 users = u,callsummary = cs,sessions = s,known_numbers = kn等。

相关问题