【问题标题】:Creating Sum/Total rows by user in sql query for csv/excel report用户在 csv/excel 报告的 sql 查询中创建 Sum/Total 行
【发布时间】:2017-12-22 16:23:50
【问题描述】:

下面的查询提取数据以形成“报告”,但它基本上只是按数字分组的行项目 企业社会责任代理人。它所做的是准确无误的,在查询后我将结果保存为 CSV。然而, 它只给我个人记录,所以我必须将它放入 excel 并使用公式插入 “总计”行基本上总结了我需要总计的列。

此 sql 查询在 php 脚本中运行,但我不确定修改其中任何内容的最佳方法,以便 我可以为每个用户汇总这些列。它会以某种方式不得不说'这是用户 7200 的记录结束 因此,插入用户 7200 的总计行,然后转到用户 7206' 的记录或类似的内容。

屏幕截图显示了报告的原样,使用“x”和空空格而不是 1 或 0,所以在我的 excel 公式中 我通常有一个计数 IF "x" 变量。我希望我可以用这个脚本做类似的事情。查询和 截图如下。

这里是小提琴:http://sqlfiddle.com/#!9/b6a568/1

fiddle 的输出是精确查询的输出,唯一的区别是脚本将其放入 csv。

我只是希望有一种方法可以为每个用户创建一个“总计”行,将“x”的数量和 持续时间和保持时间的秒数。

非常感谢任何关于我如何重构它的建议。

$result = mysqli_query($conn2,
    "SELECT
          FirstN
          , LastN
        , Extension
        , Recieved
        , Recieved_Known
        , Outbound
        , Outbound_Known
        , Missed_No_VM
        , Missed_VM
        , Missed_Known
        , Calling_Number
        , Called_Number
        , Start_Time
        , End_Time
        , Talk_Time_Seconds
        , Hold_Time_Seconds

        FROM (
          SELECT distinct
           firstn
           , lastn
           , c.extension
           , CASE WHEN LEGTYPE1 = 2 AND ANSWERED = 1 THEN 'x' ELSE '' END AS Recieved
           , case when LEGTYPE1 = 2 and answered = 1 and CALLINGPARTYNO = k.phone_number then 'x' ELSE '' end as Recieved_Known
           , CASE WHEN LEGTYPE1 = 1 then 'x' ELSE '' end  AS Outbound
           , case when  FINALLYCALLEDPARTYNO = kn.long_number then 'x' ELSE '' end as Outbound_Known
           , case when legtype1 = 2 and answered = 0 and finallycalledpartyno  not like '%oice%' then 'x' ELSE '' end as Missed_No_VM
           , case when finallycalledpartyno like '%oice%' then 'x' ELSE '' end as Missed_VM
           , case when legtype1 = 2 and ANSWERED = 0 and CALLINGPARTYNO = k.phone_number then 'x' ELSE '' end as
            Missed_Known
           , a.CALLINGPARTYNO AS Calling_Number
           , a.FINALLYCALLEDPARTYNO AS Called_Number
           , b.starttime as Start_Time
           , b.endtime as End_Time
           , b.duration as Talk_Time_Seconds
           , a.holdtimesecs as Hold_Time_Seconds

          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
        left join ambition.known_numbers kn on a.finallycalledpartyno = kn.long_number
                WHERE a.ts >= '2017-12-07' -- curdate()
                and(a.CALLINGPARTYNO in (select extension from ambition.ambition_users) OR a.finallycalledpartyno IN (select extension from ambition.ambition_users))
          ) x
          order by extension;") or die(mysqli_error( $conn2));

良好测量的屏幕截图:

【问题讨论】:

    标签: php mysql excel csv


    【解决方案1】:

    我不确定您如何唯一标识用户。我假设每个用户的扩展都是唯一的。基于此,我提出以下查询:

    SELECT
              Extension
            , Recieved
            , Recieved_Known
            , Outbound
            , Outbound_Known
            , Missed_No_VM
            , Missed_VM
            , Missed_Known
            , Talk_Time_Seconds
            , Hold_Time_Seconds
    
          FROM (
              SELECT distinct
               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 Recieved_Known
               , sum(CASE WHEN LEGTYPE1 = 1 then 1 ELSE 0 end)  AS Outbound
               , sum(case when  FINALLYCALLEDPARTYNO = kn.long_number then 1 ELSE 0 end) as Outbound_Known
               , sum(case when legtype1 = 2 and answered = 0 and finallycalledpartyno  not like '%oice%' then 1 ELSE 0 end) as Missed_No_VM
               , sum(case when finallycalledpartyno like '%oice%' then 1 ELSE 0 end) as Missed_VM
               , sum(case when legtype1 = 2 and ANSWERED = 0 and CALLINGPARTYNO = k.phone_number then 1 ELSE 0 end) as
                Missed_Known
               , sum(b.duration) as Talk_Time_Seconds
               , sum(a.holdtimesecs) as Hold_Time_Seconds
    
              FROM session a
            INNER JOIN callsummary b ON a.NOTABLECALLID = b.NOTABLECALLID
            right join users c on a.callingpartyno = c.extension or a.finallycalledpartyno = c.extension
            LEFT JOIN known_numbers k ON a.callingpartyno = k.phone_number
            left join known_numbers kn on a.finallycalledpartyno = kn.long_number
              WHERE a.ts >= '2017-12-07' -- curdate()
              and(a.CALLINGPARTYNO in (select extension from ambition_users) OR a.finallycalledpartyno IN (select extension from ambition_users))
            group by c.extension    
          ) x
    
              order by extension;
    

    上面的查询,至少,会给你一些关于如何解决问题的想法。

    【讨论】:

    • 好的,我可以看到这将分别给我总数。你知道我是否有办法插入这些以及单个记录吗?比如有用户的单条记录,那么这一行呢?或者,如果没有别的办法,我可能会以某种方式将两者都插入到单个 CSV 中
    • 在考虑了更多之后,我希望我可以围绕单个记录使用 foreach 循环,并根据用户 ID 插入总计。我只是到了这里,但我可能不得不更多地使用它。
    • 我认为我没有正确满足您的要求。但我不知道有什么方法可以使用单个查询来做到这一点。
    • 对,我认为没有办法。恐怕我将不得不使用循环并尝试将变量分配给 sql 字段
    猜你喜欢
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2016-12-10
    相关资源
    最近更新 更多