web-dev-qa-db-ja.com

mysql:1日あたりに開いているチケットの数をカウントする

次の行を持つテーブルtabNameがあります。

_id(PK) .. Created(datetime)     Resolved(datetime) Status(new/resolved/open)
1          2015-05-10 00:00:00   1970-01-01 ..       open
2          2015-05-10 ..         1970-01-01 ..       new
3          2015-05-10            2015-05-12          resolved
4          2015-05-11 ..         1970-01-01 ..       open
5          2015-05-11 ..         1970-01-01 ..       new
6          2015-05-11            2015-05-11          resolved
7          2015-05-12 ..         1970-01-01 ..       open
8          2015-05-12 ..         1970-01-01 ..       new
9          2015-05-12            2015-05-12          resolved
_

注: 1970-01-01 ..は、まだ開いているすべてのチケットのデフォルト時間です。

まだ開いているチケットの数を日付ごとに取得するには、クエリを作成する必要があります。 5月10日に3枚のチケットを開いたとしましょう。 _id = 3_の場合、解決された日付は10ではありませんが、5月12日に閉鎖されます。

私はクエリを次のように組み立てました

_SELECT DATE_FORMAT(Created, '%d-%m') AS createdd, COUNT(1)
FROM tabName
WHERE DATE_FORMAT(Resolved, '%d-%m') > DATE_FORMAT(Created, '%d-%m')
      AND YEAR(Created) = '2015'
GROUP BY createdd;
_

上記のクエリは、Resolved日付がカウントと見なされる日付よりも大きいすべてのチケットを取得します。これにより、新しいチケットもカウントされる場合があります。また、まだ解決されていない古いチケットはカウントされません。

必要なクエリをフレーム化する他の方法はありますか?私はこのクエリを過去3日間使用しています。まだ見つけることができません。

更新:Abhikの提案に従い、sqlfiddleサイトで試しました。

これが私が作成したものです:

_CREATE TABLE test (_ id _int,_ created _datetime,_ resolveddatetime, status varchar(15), PRIMARY KEY (id)); INSERT INTO test ( id _,'created','resolved',_ status`)VALUES(1、 '2015-05-10 00:00:00'、 '1970-01-01 00: 00:00 '、' open ')、

_  (2,'2015-05-10 00:00:00','1970-01-01 00:00:00','new'),

  (3,'2015-05-10 00:00:00','2015-05-12 00:00:00','resolved'),

  (4,'2015-05-11 00:00:00','1970-01-01 00:00:00','open'),

  (5,'2015-05-11 00:00:00','1970-01-01 00:00:00','new'),

  (6,'2015-05-11 00:00:00','2015-05-11 00:00:00','resolved'),

  (7,'2015-05-12 00:00:00','1970-01-01 00:00:00','open'),

  (8,'2015-05-12 00:00:00','1970-01-01 00:00:00','new'),

  (9,'2015-05-12 00:00:00','1970-01-01 00:00:00','open')

  ;
  `
_

私が走るとき

`select created_date、@open:= @ open + open_ticket-resolved as open from(select date_format(created、 '%d-%m')as created_date、

sum(status = 'open'の場合は1、それ以外は0 end)+

sum(status = 'new'の場合は1、それ以外は0 end)+

sum(status = 'resolved'および(date(resolved)> date(created)の場合)または

date(resolved)= date(created))then 1 else 0 end)open_ticket、

sum(status = 'resolved'かつdate(resolved)= date(created)の場合の場合は1

そうでなければ0終了)解決済み

テストから

どこ

YEAR(作成)= '2015'

created_date)xでグループ化、

(@open:= 0を選択します)r created_dateによる順序; `

私は次の出力を得ました

_created_date open 10-05 3 11-05 5 12-05 8_

ここで、12-05のまだ開いているチケットの数は7でなければなりません。上記のクエリには、12-05にクローズされたチケットID "3"が含まれています。これを除外する方法はありますか?これを正しく行うことができれば、本格的なクエリを実行できます。

1
Tingrammer

この計算に条件付き合計を使用することができます

select 
date_format(created,'%d-%m') as created_date , 
sum( case when status='open' then 1 else 0 end )+
sum( case when status='new' then 1 else 0 end )+
sum( case when status='resolved' and date(resolved) > date(created) then 1 else 0 end ) as open
from table_name
where
YEAR(Created) = '2015'
group by created_date ;

これはテストケースです

mysql> select * from test ;
+------+---------------------+---------------------+----------+
| id   | created             | resolved            | status   |
+------+---------------------+---------------------+----------+
|    1 | 2015-05-10 00:00:00 | 1970-01-01 00:00:00 | open     |
|    2 | 2015-05-10 00:00:00 | 1970-01-01 00:00:00 | new      |
|    3 | 2015-05-10 00:00:00 | 2015-05-12 00:00:00 | resolved |
|    4 | 2015-05-11 00:00:00 | 1970-01-01 00:00:00 | open     |
|    5 | 2015-05-11 00:00:00 | 1970-01-01 00:00:00 | new      |
|    6 | 2015-05-11 00:00:00 | 2015-05-11 00:00:00 | resolved |
+------+---------------------+---------------------+----------+
6 rows in set (0.00 sec)

mysql> select 
    -> date_format(created,'%d-%m') as created_date , 
    -> sum( case when status='open' then 1 else 0 end )+
    -> sum( case when status='new' then 1 else 0 end )+
    -> sum( case when status='resolved' and date(resolved) > date(created) then 1 else 0 end ) as open
    -> from test
    -> where
    -> YEAR(Created) = '2015'
    -> group by created_date ;
+--------------+------+
| created_date | open |
+--------------+------+
| 10-05        |    3 |
| 11-05        |    2 |
+--------------+------+
2 rows in set (0.00 sec)

[〜#〜] update [〜#〜]コメントに従って、オープンの数は増分されます。だから、以下はトリックをするべきです

select
created_date,
@open:= @open+open_ticket-resolved as open
from(
 select 
 date_format(created,'%d-%m') as created_date , 
 sum( case when status='open' then 1 else 0 end )+
 sum( case when status='new' then 1 else 0 end )+
 sum( case when status='resolved' and ( date(resolved) > date(created) or date(resolved) = date(created)) then 1 else 0 end ) as open_ticket,
 sum(case when status = 'resolved' and date(resolved) = date(created) then 1 else 0 end) as resolved
 from test
 where
 YEAR(Created) = '2015'
 group by created_date
)x,(select @open:=0)r order by created_date ; 

上記のサンプルデータから、

 +--------------+------+
| created_date | open |
+--------------+------+
| 10-05        |    3 |
| 11-05        |    5 |
+--------------+------+

更新:

特定の日に解決された以前のチケットをカウントし、当日のオープンチケットから差し引いて、left joinのようなもの

select
created_date,
@open:= @open+open_ticket-resolved_ticket as open
from(
 select 
 date_format(t.created,'%d-%m') as created_date , 
 sum( case when t.status='open' then 1 else 0 end )+
 sum( case when t.status='new' then 1 else 0 end )+
 sum( case when t.status='resolved' and ( date(t.resolved) > date(created) or date(t.resolved) = date(created)) then 1 else 0 end ) as open_ticket,
 coalesce(tot,0) as resolved_ticket
 from test t left join(
    select count(*) as tot, date(resolved) as resolved from test where status='resolved' group by date(resolved)
 )x on date(x.resolved) = date(t.created) 
 where
 YEAR(t.created) = '2015'
 group by created_date
)x,(select @open:=0)r order by created_date ; 

出力:

+--------------+------+
| created_date | open |
+--------------+------+
| 10-05        |    3 |
| 11-05        |    5 |
| 12-05        |    7 |
+--------------+------+
2