MySQL9(count,group by,having)

その8から続きます。

1:対象行の行数を数えるcount集約関数

例:ECサイト(架空)のユーザーが何人いるか調べたい!

select count(*) from users;

※ポイント

count(*)とするとテーブルの行数をすべて取得できる。

女性ユーザーが何人いるのか知りたい!

select count(*) from users where users.gender = 2;

2:応用)2017年1月にアクセスした ユニークユーザー数(ec サイト登録ユーザのみ)を調べたい!

そもそもユニークアクセスユーザーとは?(ヒント)

1:決まった集計期間内にアクセスしたユーザーの数を表す数値

2:あるユーザーA が決まった期間内に10アクセスしたとしても1と数える。where句と集約関数 count (distinct expr)を組み合わせて使う。

3:count (distinct expr)の形で、count関数は重複を排除した形で個数を取得できる

ER図を参考にまず2017年1月にアクセスしたユーザ数を書いてみる

select * from access_logs where request_month = '2017-01-01';

次にユニークユーザ数の記述をする

select 
 count(distinct user_id) 
 from access_logs 
 where request_month = '2017-01-01';

データをグループ化(group by句)

例:都道府県別のユーザー数を調べたい!

 select
 prefecture_id,count(*)
 from users
 group by prefecture_id;

※ポイント

group byで指定する列名(prefecture_id)グループ化したものをcount集計してあげる

応用)2017年の月別ユニークユーザー数を知りたい!

ヒント:ER図を参考にしてaccess_logsテーブルのrequest_monthを使う

 select
 request_month,
 count(distinct user_id)
 from
 access_logs 
 where 
 request_month >='2017-01-01 00:00:00'
 and request_month <'2018-01-01 00:00:00'
 group by
 request_month;

※ポイント

whererequest_monthの期間を指定しgroup byrequest_monthを月ごとにグループ化する。最後にcount(distinct user_id)ユニークユーザーを調べる

集約結果をさらに絞り込む(having句)

※ポイント

having count(distinct user_id) >= 630;

により630以上の月のみに絞り込む

例1:アクセスログを2017年1月から2017年6月まで調べたい!

select * from access_logs where request_month >=’2017-01-01′
and request_month <‘2017-07-01’;

例2:月ごと(1月から6月まで)のリクエスト数を調べたい!

 select
 request_month,
 count(*)
 from
 access_logs
 where
 request_month >='2017-01-01'
 and request_month <'2017-07-01'
 group by
 request_month;

例3:(1月から6月まで)のアクセス数が1,000以上の月だけ抜き出したい!

select
  request_month,
  count(*) 
from
  access_logs
where 
  request_month >='2017-01-01'
  and request_month <'2017-07-01' 
group by 
  request_month 
  having
  count(*) >= 1000;

※ポイント

アクセス数なのでcount(*)で数え上げる。having句で1000以上のみ表示

その10に続きます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です