Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何按工作时间选择电话、应答、交易、费率等?_Php_Mysql_Sql - Fatal编程技术网

Php 如何按工作时间选择电话、应答、交易、费率等?

Php 如何按工作时间选择电话、应答、交易、费率等?,php,mysql,sql,Php,Mysql,Sql,我需要按分组工作时间选择电话、应答、交易、费率、通话时间 以下是我的选择: SELECT users.username as username, DATE_FORMAT(users_worktime.start,'%Y-%m-%d') as start, SUM(users_worktime.length) as working_time FROM users_worktime LEFT JOIN users ON users.id = users_wor

我需要按分组工作时间选择电话、应答、交易、费率、通话时间

以下是我的选择:

SELECT
    users.username as username,
    DATE_FORMAT(users_worktime.start,'%Y-%m-%d') as start,
    SUM(users_worktime.length) as working_time
FROM
    users_worktime
    LEFT JOIN users ON users.id = users_worktime.user_id 
WHERE 1
    AND users_worktime.user_id = '8'
    AND users_worktime.start >= '2015-12-30 00:00:00'
    AND users_worktime.start <= '2015-12-31 23:59:59'
GROUP BY
    DAY(users_worktime.start)
我的问题是:如何从表调用中选择计数调用、应答-状态为“结束”的所有调用求和、从表订单中选择计数处理、速率-处理/求和调用以及通话时间-调用。调用长度。所有这些都是根据分组的工作时间来选择的

我需要这样的结果:

| username | start       | calls | answers | deals | rate | talking_time| working_time |
----------------------------------------------------------------------------------------
| Haroldas | 2015-12-30  | 1     | 1       | 1     | 100% | 35          | 85.00        | 
| Haroldas | 2015-12-31  | 3     | 2       | 1     | 50%  | 160         | 170.00       |
以下是我的数据表:

用户的工作时间:

| id | user_id | length | start               |
-----------------------------------------------
| 1  | 8       | 30     | 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 |
-----------------
| 8  | Haroldas | 
电话:

| id | user_id | order_id | status  | call_length | created_at          |
-------------------------------------------------------------------------
| 1  | 8       | 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  | 8       |1       | 2015-12-30 07:53:38 |
| 4  | 8       |2       | 2015-12-31 12:53:38 |
当用户Haroldas在这些天工作时,有多少电话/应答/交易/等


谢谢

您可以按用户id和时间离开加入。例如

FROM
users_worktime
LEFT JOIN users ON users.id = users_worktime.user_id 
LEFT JOIN users ON users.id = calls.user_id 
               AND DAY(users_worktime.start)=DAY(calls.created_at)
然后将所有必要的聚合函数应用于调用数据

您可以使用子查询来实现您的目标。我还更改了基本查询,因为如果用户在指定的时间段内未工作,您将看不到记录

SELECT T2.*,
   (deals / answers_cnt) * 100 AS rate
FROM
(SELECT T.username,
       T.day_start
       SUM(T.working_time) AS working_time,
       (SELECT COUNT(*) FROM calls AS C 
        WHERE DATE(created_at) = T.day_start
                  AND C.user_id = T.user_id) AS calls_cnt,
        (SELECT COUNT(*) FROM calls AS C 
        WHERE DATE(created_at) = T.day_start
                  AND C.user_id = T.user_id
                  AND C.status = 'ended') AS answers_cnt,
        (SELECT SUM(call_length) FROM calls AS C 
        WHERE DATE(created_at) = T.day_start
                  AND C.user_id = T.user_id) AS talking_time,
        (SELECT COUNT(*) FROM orders AS O
         WHERE DATE(O.start) = T.day_start
                   AND O.user_id = T.user_id) AS deals_cnt         
FROM
    (SELECT U.username,
            U.id AS user_id,
            DATE(UW.start) as day_start,
            UW.length AS working_time       
    FROM users AS U
        LEFT JOIN users_worktime AS UW ON UW.user_id = U.id
    WHERE U.id = 8
              AND UW.start >= '2015-12-30 00:00:00'
              AND UW.start <= '2015-12-31 23:59:59') AS T
GROUP BY T.username, T.user_id, T.day_start
) AS T2

您可以在selectionfabulaspb中尝试使用子选择,您就是老板!它起作用了。我只有一个问题:现在,day_start列显示了第30天和第31天。如何显示2015-12-30和2015-12-31等完整日期?谢谢我修改了我的查询。
SELECT T2.*,
   (deals / answers_cnt) * 100 AS rate
FROM
(SELECT T.username,
       T.day_start
       SUM(T.working_time) AS working_time,
       (SELECT COUNT(*) FROM calls AS C 
        WHERE DATE(created_at) = T.day_start
                  AND C.user_id = T.user_id) AS calls_cnt,
        (SELECT COUNT(*) FROM calls AS C 
        WHERE DATE(created_at) = T.day_start
                  AND C.user_id = T.user_id
                  AND C.status = 'ended') AS answers_cnt,
        (SELECT SUM(call_length) FROM calls AS C 
        WHERE DATE(created_at) = T.day_start
                  AND C.user_id = T.user_id) AS talking_time,
        (SELECT COUNT(*) FROM orders AS O
         WHERE DATE(O.start) = T.day_start
                   AND O.user_id = T.user_id) AS deals_cnt         
FROM
    (SELECT U.username,
            U.id AS user_id,
            DATE(UW.start) as day_start,
            UW.length AS working_time       
    FROM users AS U
        LEFT JOIN users_worktime AS UW ON UW.user_id = U.id
    WHERE U.id = 8
              AND UW.start >= '2015-12-30 00:00:00'
              AND UW.start <= '2015-12-31 23:59:59') AS T
GROUP BY T.username, T.user_id, T.day_start
) AS T2