2016-01-18 8 views
6

ユーザーあたりの一意のログイン日数を数えてクエリを作成しています(1-2、 3-4ログイン日など)、部門ごとに各バケットの各ユーザー数を返します。これがあまり明確でない場合はお詫び申し上げます。下記の例が私の質問を示すのに役立つことを願っています。MySQL - 一意のログイン日数と部署別のユーザー数でグループ化する

私はこのようなテーブルを持っている:私はこのようなテーブル返したい

+-------------+-----------+------------+-----------------+ 
| time  | user_name | dept |  event  | 
+-------------+-----------+------------+-----------------+ 
| 2016-01-04 | Joe  | finance | logged in  | 
| 2016-01-04 | Jeff  | marketing | logged in  | 
| 2016-01-04 | Jeff  | marketing | project created | 
| 2016-01-04 | Bob  | finance | logged in  | 
| 2016-01-04 | Mark  | accounting | logged in  | 
| 2016-01-05 | Bob  | finance | logged in  | 
| 2016-01-08 | Bob  | finance | logged in  | 
| 2016-01-09 | Jeff  | marketing | logged in  | 
| 2016-01-10 | Jeff  | marketing | logged in  | 
| 2016-01-11 | Nate  | accounting | logged in  | 
| 2016-01-11 | Nate  | accounting | project created | 
+-------------+-----------+------------+-----------------+ 

select 
(case when count(distinct(`time`)) between 1 and 2 then '1-2' 
     when count(distinct(`time`)) between 3 and 4 then '3-4' 
     else '5+' 
     end) as buckets, dept, user_name 
    from change_log where event in ('logged in') 
    group by dept, user_name 

:今のところ

+------------------+-----------------+------------+ 
| number of logins | number of users | dept | 
+------------------+-----------------+------------+ 
| 1-2    |    1 | finance | 
| 3-4    |    1 | finance | 
| 5+    |    0 | finance | 
| 1-2    |    0 | marketing | 
| 3-4    |    1 | marketing | 
| 5+    |    0 | marketing | 
| 1-2    |    2 | accounting | 
| 3-4    |    0 | accounting | 
| 5+    |    0 | accounting | 
+------------------+-----------------+------------+ 

を、私のクエリは次のようになりますしかし、これは以下のようなテーブルを返しています。これは私が望むものに最も近いものですが、私はそれをロールバックする方法がわかりませんバケツと部門。

+---------+------------+-----------+ 
| buckets | dept | user_name | 
+---------+------------+-----------+ 
| 1-2  | accounting | Mark  | 
| 1-2  | accounting | Nate  | 
| 3-4  | finance | Bob  | 
| 1-2  | finance | Joe  | 
| 3-4  | marketing | Jeff  | 
+---------+------------+-----------+ 

答えて

2

このようなものはありますか?

select buckets, dept, count(user_name) no_of_u from 
(select 
(case when count(distinct(`time`)) between 1 and 2 then '1-2' 
     when count(distinct(`time`)) between 3 and 4 then '3-4' 
     else '5+' 
     end) as buckets, dept, user_name 
    from change_log where event in ('logged in') 
    group by dept, user_name) 
group by buckets, dept 
+0

これは動作するようです!私は「すべての派生テーブルには別のエイリアスが必要です。エラーメッセージが表示されますが、2番目のselectステートメントから派生テーブルにエイリアスを渡した後に動作しました。どうもありがとう!私はまだネストされた選択ステートメントに慣れようとしています。 – user5805996

+0

私は本当に本当に必要な場合、私はそれらを使用します。ほとんどの場合、私は複数の選択されたステムをネストして混乱します。そのような場合、私は一時的なテーブルを作成し、それらを使用して最終結果を得ようとします。 – Nomeaning25

-1

ちょうど私が理解確かに、あなたは基本的にこれを実行しようとしている:

select 
    (case when count(distinct(`time`)) between 1 and 2 then '1-2' 
      when count(distinct(`time`)) between 3 and 4 then '3-4' 
      else '5+' 
    end) as buckets, dept, count(*) as `number of users` 
from change_log where event in ('logged in') 
group by dept, buckets 

あなたがの出力にグループことができないので、今、あなたは、MySQLの中でそれを行うことはできませんケースステートメントですが、機能的にはそれが望ましい結果ですか?

0

しかし、あなたはこのようにそれを行うことができます。

select 
    ELT(LEAST(count(*),5), '1-2', '1-2', '3-4', '3-4','5+') as buckets, 
    dept, 
    count(*) as `number of users` 
FROM change_log where event in ('logged in') 
WHERE event in ('logged in') 
GROUP BY 
    dept, 
    ELT(LEAST(count((*),5), '1-2', '1-2', '3-4', '3-4','5+');