まずは、eventlogテーブルからイベントの開始時間とユーザーID、ユーザーのレベルを表示します。
SELECT
startTime,
eventlog.userID,
users.level
FROM eventlog
INNER JOIN users ON users.userID = eventlog.userID;
eventlogから、startTime(イベントの開始時間)とeventlogテーブルのuserID、usersテーブルのlevelを取り出し、usersテーブルはusersテーブルのuserIDとeventlogテーブルのuserIDで結合しています。
このSQLを実行すると、
このようになります。
次に、このSQL文を改良してクロス集計を作成していきます。
まずは、日と時間が出力されている日付を年月のみ出力するようにして、ユーザーのレベルごとに初級者、中級者、上級者でグループ分けしていきます。
SELECT
DATE_FORMAT(startTime, '%Y-%m') AS 日付,
eventlog.userID AS ユーザー,
CASE
WHEN users.level >= 4 THEN '上級者'
WHEN users.level >= 2 THEN '中級者'
ELSE '初級者'
END AS 'ランク'
FROM eventlog
INNER JOIN users ON users.userID = eventlog.userID
ORDER BY eventlog.userID;
DATE_FORMAT関数を使い日付を年月のみにし、CASE式を使ってユーザーのレベルを参照してランク付けを行っています。
このSQLを実行すると、
このように、日付、ユーザー、ランクのリストが表示されました。
次に、ユーザーが重複して表示されているので、これを重複しないように表示します。
SELECT DISTINCT
DATE_FORMAT(startTime, '%Y-%m') AS 日付,
eventlog.userID AS ユーザー,
CASE
WHEN users.level >= 4 THEN '上級者'
WHEN users.level >= 2 THEN '中級者'
ELSE '初級者'
END AS 'ランク'
FROM eventlog
INNER JOIN users ON users.userID = eventlog.userID;
SELECTで抽出するデータを、DISTINCTで重複しないようにします。
このSQLを実行すると、
このように、ユーザーが重複しないようにデータを出力できました。
続いて、クロス集計表を作るためにこのSQLをサブクエリにします。
SELECT 日付,
ユーザー,
ランク
FROM (SELECT DISTINCT
DATE_FORMAT(startTime, '%Y-%m') AS 日付,
eventlog.userID AS ユーザー,
CASE
WHEN users.level >= 4 THEN '上級者'
WHEN users.level >= 2 THEN '中級者'
ELSE '初級者'