今回題材としているオンラインRPGでは、イベントごとに獲得できる経験値やゴールドは決まっています。
そこで、eventlogテーブルからユーザーが獲得した経験値の合計や、平均を計算して表示していきます。
まずは、ユーザーIDと、各ユーザーが獲得した経験値を表示してみます。
以下のSQL文を使用します。
SELECT
eventlog.userID AS ユーザーID,
events.increase_exp AS 獲得経験値
FROM
eventlog
INNER JOIN events ON events.eventID = eventlog.eventID;
eventlogテーブルとeventsテーブルを、それぞれのテーブルのeventIDで関連付け、eventlogにあるuserIDと、eventsテーブルにある獲得経験値を表示させます。
このSQL文を実行すると、このようになります。
このように、ユーザーIDと獲得経験値が表示されました。
ちょっと見にくいので、それぞれのユーザーが獲得した経験値を合計して表示してみます。
合計を表示するためには、SUM関数を使用します。
SELECT
eventlog.userID AS ユーザーID,
SUM(events.increase_exp) AS 合計獲得経験値
FROM
eventlog
INNER JOIN events ON events.eventID = eventlog.eventID
GROUP BY eventlog.userID;
events.increase_expをSUMで括って、GROUP BYでeventlog.userIDをひとまとめにします。
このSQL文を実行すると、このようになります。
ユーザーIDをひとまとめにし、獲得経験値を合計して表示することができました。
SQLでは、このように関数やGROUP BYを使用して合計や平均を求める事ができます。
では続いて、獲得経験値の平均を求めてみます。
ユーザーがいろんなイベントを実行する中で、1イベントで獲得できる経験値の平均を計算します。
平均を求めるには、AVGというアベレージ関数を使用します。
SELECT
eventlog.userID AS ユーザーID,
SUM(events.increase_exp) AS 合計獲得経験値,
AVG(events.increase_exp) AS 平均獲得経験値
FROM
eventlog
INNER JOIN events ON events.eventID = eventlog.eventID
GROUP BY eventlog.userID;
SUMの下にAVGを入れ、平均獲得経験値を計算しています。
このSQL文を実行すると、このようになります。
このように、合計獲得経験値の隣に獲得した経験値の平均が表示されました。
今度は集計した結果から、表示するデータを絞り込んでみます。
同じデータの中で絞り込む場合、HAVINGという命令が使えます。
HAVINGは、WHEREと同じように使える命令ですが、WHEREと違ってGROUP BYでまとめた後に使う事ができます。
まずは、獲得した経験値の合計が3000以上のユーザーに絞り込んで表示してみます。
SELECT
eventlog.userID AS ユーザーID,
SUM(events.increase_exp) AS 合計獲得経験値,
A