1

テーブル「phone_call」から

SELECT * FROM phone_call;

*************************** 181. row ***************************
     id: 682
user_id: 24
  start: 2013-09-03 17:59:18
    end: 2013-09-03 17:59:20
ext_num: 2008
destination: 123473654172
call_id: 5eab044f19ed41d70661c3220f1b5c65
direction: I
created_at: 2013-09-03 17:59:18
updated_at: 2013-09-03 17:59:20
 totals: 1
*************************** 182. row ***************************
     id: 683
user_id: 22
  start: 2013-09-03 17:59:18
    end: 2013-09-03 17:59:20
ext_num: 2002
destination: 123456587458
call_id: 2eb1d9ea2e1937be30f1e93878eb3efe
direction: O
created_at: 2013-09-03 17:59:18
updated_at: 2013-09-03 17:59:20
 totals: 1
182 rows in set (0.00 sec)

...more

上記のデータから、次を返すクエリが必要です。

 ext_num, username, calls_in, calls_out, avg_in, avg_out 

データから、その場でオールインワンですが、少し苦労しています。

次のように個々のパーツを取得できます。

SELECT AVG(timediff(end, start)) AS avg_in FROM phone_call WHERE user_id=24 AND  direction='I';
+---------------------------+
| avg_in                    |
+---------------------------+
| 22.0810810811             |
+---------------------------+
1 row in set (0.00 sec)

SELECT AVG(timediff(end, start)) AS avg_out FROM phone_call WHERE user_id=24 AND direction='O';
+---------+
| avg_out |
+---------+
|    NULL |
+---------+
1 row in set (0.00 sec)

このユーザー (24) の「コールアウト」(方向 =「O」) はありません。

SELECT ext_num, sum(totals) AS `calls_in`, u.username
FROM phone_call pc 
JOIN user u ON pc.user_id=u.id 
WHERE user_id=24 and direction='I';
+---------+----------+----------+
| ext_num | calls_in | username |
+---------+----------+----------+
|    2008 |       37 | Esi      |
+---------+----------+----------+
1 row in set (0.00 sec)

SELECT sum(totals) AS `calls_out`
FROM phone_call
WHERE user_id=24 and direction='O';
+-----------+
| calls_out |
+-----------+
|      NULL |
+-----------+
1 row in set (0.00 sec)

しかし、一体どのようにしてそれらをすべて結合して、1 つの弦またはテューペレを作成するのでしょうか?

編集:私のテーブル構造:

describe phone_call;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_id     | int(11)      | NO   | MUL | NULL    |                |
| start       | datetime     | YES  |     | NULL    |                |
| end         | datetime     | YES  |     | NULL    |                |
| ext_num     | int(11)      | YES  |     | NULL    |                |
| destination | varchar(45)  | YES  |     | NULL    |                |
| call_id     | varchar(100) | YES  |     | NULL    |                |
| direction   | varchar(1)   | YES  |     | NULL    |                |
| created_at  | datetime     | YES  |     | NULL    |                |
| updated_at  | datetime     | YES  |     | NULL    |                |
| totals      | int(1)       | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
11 rows in set (0.00 sec)

編集:@Mahmoud 実行中:

SELECT 
u.ext_num,
u.username,
AVG(CASE WHEN pc.direction = 'I' THEN timediff(pc.end, pc.start))  ELSE 0 END)AS avg_in,
AVG(CASE WHEN pc.direction = 'O' THEN timediff(pc.end, pc.start))  ELSE 0 END)AS avg_out,
sum(CASE WHEN pc.direction = 'I' THEN totals ELSE 0 END) AS `calls_in`, 
sum(CASE WHEN pc.direction = 'O' THEN totals ELSE 0 END) AS `calls_out`
FROM phone_call AS pc
JOIN user u ON pc.user_id=u.id 
WHERE u.user_id=24 
GROUP BY u.user_id, u.ext_num;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that     corresponds to your MySQL server version for the right syntax to use near ')  ELSE 0 END)AS avg_in,
AVG(CASE WHEN pc.direction = 'O' THEN timediff(pc.end' at line 4
4

2 に答える 2

2

CASE1 つのクエリでこれを行うには式を使用し、列ごとに条件WHEN pc.direction = 'I'とを使用する必要があります。when pc.direction = 'O'

SELECT 
  u.ext_num,
  u.username,
  AVG(CASE WHEN pc.direction = 'I' THEN timediff(pc.end, pc.start) END)AS avg_in,
  AVG(CASE WHEN pc.direction = 'O' THEN timediff(pc.end, pc.start) END)AS avg_out,
  sum(CASE WHEN pc.direction = 'I' THEN totals ELSE 0 END) AS `calls_in`, 
  sum(CASE WHEN pc.direction = 'O' THEN totals ELSE 0 END) AS `calls_out`
FROM phone_call AS pc
JOIN user u ON pc.user_id=u.id 
WHERE u.user_id=24 
GROUP BY u.user_id, u.ext_num;
于 2013-09-04T11:36:52.553 に答える
0

これはあなたのために働くかもしれません!

 SELECT ext_num,  AVG(timediff(pc.end, pc.start)) as `avg_in`, NULL as `avg_out` , sum(totals) AS `calls_in`, NULL as `calls_out`, u.username
FROM phone_call pc JOIN user u ON pc.user_id=u.id 
WHERE user_id=24 and direction='I'
GROUP BY u.user_id, u.ext_num

UNION

SELECT ext_num, NULL as `avg_in`, AVG(timediff(pc.end, pc.start)) as `avg_out`, NULL AS `calls_in`, sum(totals) as `calls_out`, u.username
FROM phone_call pc 
JOIN user u ON pc.user_id=u.id 
WHERE user_id=24 and direction='O'
GROUP BY u.user_id, u.ext_num
于 2013-09-04T11:43:44.577 に答える