0

私は次のように2 tblsを持っています。

tbl をリクエスト

id | request | created
1  | asdf    | 2013-07-04 14:39:03
2  | qwer    | 2013-07-10 12:06:37

履歴表

id | request_id | status       | date
1  |     1      | Pending      | 2013-07-04 14:39:03
2  |     1      | Reviewing    | 2013-07-05 01:10:14
3  |     1      | Implementing | 2013-07-06 11:25:54
4  |     1      | Completed    | 2013-07-07 12:36:32
5  |     2      | Pending      | 2013-07-10 15:05:56
6  |     2      | Reviewing    | 2013-07-11 03:08:04
7  |     2      | Implementing | 2013-07-13 11:45:48
8  |     2      | Completed    | 2013-07-17 14:28:15

次のように2テーブル以上表示したい

Request | Reviewing Time | Implementing Time 
asdf    |      0         |      0            
qwer    |      1         |      2

request_id = 1 の例を含む理論は次のとおりです。

レビューから実装まで = (2013-08-06) - (2013-08-05) = 1 日

審査待ち = (2013-08-05) - (2013-08-04) = 1 日

レビュー時間= (レビューから実装まで) - (レビュー待ち) = 0 日

レビューから実装まで = (2013-08-06) - (2013-08-05) = 1 日

実装から完了 = (2013-08-07) - (2013-08-06) = 1 日

実装時間= (実装から完了まで) - (レビューから実装まで) = 0

4

2 に答える 2

1

ここにそれを解決するための長い手があります...

 CREATE TABLE my_table 
 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
 ,request_id INT NOT NULL
 ,status       VARCHAR(20) NOT NULL
 ,date DATETIME NOT NULL
 ,UNIQUE(request_id,status)
 );

 INSERT INTO my_table VALUES
 (1  ,1      ,'Pending','2013-07-04 14:39:03'),
 (2  ,     1      ,'Reviewing','2013-07-05 01:10:14'),
 (3  ,     1      ,'Implementing','2013-07-06 11:25:54'),
 (4  ,     1     ,'Completed','2013-07-07 12:36:32'),
 (5  ,     2     ,'Pending','2013-07-10 15:05:56'),
 (6  ,     2     ,'Reviewing','2013-07-11 03:08:04'),
 (7  ,     2     ,'Implementing','2013-07-13 11:45:48'),
 (8  ,     2     ,'Completed','2013-07-17 14:28:15');

 SELECT request_id
      , DATEDIFF(implementing,reviewing) - DATEDIFF(reviewing,pending) rT
      , DATEDIFF(completed,implementing) - DATEDIFF(implementing,reviewing) iT
 FROM (
 SELECT x.request_id
      , MAX(CASE WHEN status = 'pending' THEN date END) pending 
      , MAX(CASE WHEN status = 'reviewing' THEN date END) reviewing
      , MAX(CASE WHEN status = 'implementing' THEN date END) implementing
      , MAX(CASE WHEN status = 'completed' THEN date END) completed
   FROM my_table x
  GROUP 
     BY request_id
     ) a;

 +------------+------+------+
 | request_id | rT   | iT   |
 +------------+------+------+
 |          1 |    0 |    0 |
 |          2 |    1 |    2 |
 +------------+------+------+

同じのsqlfiddle: http://www.sqlfiddle.com/#!2/fc6db/1

于 2013-08-05T10:17:31.283 に答える