如何通过呼叫时间,组ID来选择工作时间?

时间:2016-01-05 10:35:57

标签: mysql sql

当用户按主叫时间和用户组ID呼叫时,我需要选择工作时间 - SUM(users_worktime.length)作为working_time 。怎么做?

这是我的选择:

SELECT
    users_groups.name as name,
    COUNT(DISTINCT calls.id) as calls,
    SUM(calls.status = 'ended') as answers,
    COUNT(DISTINCT orders.id) as deals,
    ROUND(COUNT(DISTINCT orders.id) * 100 / SUM(calls.status = 'ended'),2) as rate,
    SUM(case when calls.status = 'ended' then calls.call_length else 0 end) as talking_time,
    //SUM(users_worktime.length) as working_time
FROM
    users_groups
    LEFT JOIN users ON users.group_id = users_groups.id
    LEFT JOIN calls ON (calls.user_id = users.id AND calls.created_at >= '2015-12-30 00:00:00' AND calls.created_at <= '2015-12-31 23:59:59')
    LEFT JOIN orders ON orders.id = calls.order_id AND orders.status = 'finished'
WHERE 1
    AND users.group_id = 1
GROUP BY
    users_groups.id

我需要这样的结果:

| name   | calls | answers | deals | rate | talking_time| working_time |
------------------------------------------------------------------------
| Group  | 4     | 3       | 2     | 75 % | 180         | 355.00       | 

以下是我的数据表:

users_worktime:

| id | user_id | length | start               |
-----------------------------------------------
| 1  | 2       | 130    | 2015-12-30 07:53:38 |
| 2  | 8       | 55     | 2015-12-30 12:53:38 |
| 3  | 8       | 170    | 2015-12-31 22:53:38 |

用户:

| id | username | group_id |
----------------------------
| 2  | Thomas   | 1        |
| 8  | Haroldas | 1        |

基团:

| id | name  |
-------------
| 1  | Group |

调用:

| id | user_id | order_id | status  | call_length | created_at          |
-------------------------------------------------------------------------
| 1  | 2       | 3        | ended   | 35          | 2015-12-30 07:53:38 |
| 2  | 8       | 4        | ended   | 100         | 2015-12-31 12:53:38 |
| 3  | 8       | NULL     | started | 15          | 2015-12-31 14:53:38 |
| 4  | 8       | NULL     | ended   | 45          | 2015-12-31 20:53:38 |

订单:

| id | user_id | call_id | start              |
-----------------------------------------------
| 3  | 2       |1       | 2015-12-30 07:53:38 |
| 4  | 8       |2       | 2015-12-31 12:53:38 |

谢谢

编辑:

我尝试使用这样的子查询但不正确,因为SUM只是组中的一个用户

SELECT
    users_groups.name as name,
    COUNT(DISTINCT calls.id) as calls,
    SUM(calls.status = 'ended') as answers,
    COUNT(DISTINCT orders.id) as deals,
    ROUND(COUNT(DISTINCT orders.id) * 100 / SUM(calls.status = 'ended'),2) as rate,
    SUM(case when calls.status = 'ended' then calls.call_length else 0 end) as talking_time,
    (SELECT SUM(users_worktime.length) FROM users_worktime WHERE users_worktime.user_id = users.id AND users_worktime.start >= '2015-12-30 00:00:00' AND users_worktime.start <= '2015-12-31 23:59:59') as working_time
FROM
    users_groups
    LEFT JOIN users ON users.group_id = users_groups.id
    LEFT JOIN calls ON (calls.user_id = users.id AND calls.created_at >= '2015-12-30 00:00:00' AND calls.created_at <= '2015-12-31 23:59:59')
    LEFT JOIN orders ON orders.id = calls.order_id AND orders.status = 'finished'
WHERE 1
    AND users.group_id = 1
GROUP BY
    users_groups.id

0 个答案:

没有答案