こちらの記事の続きです。
前回はHANAのユーザと権限ロールを作成しましたので、今回はHANAのSQLコンソールからクエリを実行したいと思います。今回はこちらのTutorialを参照しています。
まず最初に"Open in SAP HANA Database Explorer"を開きます。
画面左上の”Open the SQL Console”をクリックしてSQLコンソールを開きます。キーボードのショートカットでも開くことができます(WindowsはCtrl+Alt+C、MacはCommand+Option+C)。
SQLコンソールが開きます。(私は何回か開き直したためコンソールの番号が4になっていますが、通常は1から開きます。)
今回は、こちらの投稿でインポートしたSLIGHT
というスキーマを使用します。
https://qiita.com/IT_Tech_Firm/items/fa2343e0ccd77e05b6f2
以下のクエリを実行して、スキーマをSFLIGHT
にします。
SET SCHEMA SFLIGHT;
SQLコンソール右上のスキーマからDBADMIN
からSFLIGHT
に変わります。
今回のTutorialでは、最も人気のあるBest Run Travel代理店を見つけるためのクエリを実行します。これには、代理店番号と予約の詳細が必要です。つまり、SBOOK
テーブルとSTRAVELAG
テーブルを使用する必要があります。SBOOK
はS+BOOK(予約)、STRAVELAG
はS+TRABEL(旅行)+AG(Agency=代理店)とお考えください。
まずは、代理店ごとの予約の総数を抽出します。これを達成するために、既存のテーブルSBOOKとSTRAVELAGから新しいテーブルSAGENCYDATA
を作成することから始めます。以下のSQL文を実行します。
CREATE TABLE SAGENCYDATA as (select SBOOK.AGENCYNUM, count(SBOOK.AGENCYNUM) as NUMBOOKINGS FROM SBOOK, STRAVELAG WHERE SBOOK.AGENCYNUM=STRAVELAG.AGENCYNUM group by SBOOK.AGENCYNUM ORDER BY count(SBOOK.AGENCYNUM) desc)
以下のSQL文で作成したテーブルSAGENCYDATA
の中身を表示させます。
SELECT * FROM SAGENCYDATA;
STRAVELAG
テーブルとSAGENCYDATA
テーブルをAGENCYNUM
列に基づいて結合し、結果からトップ5の代理店を抽出します。これにより、トップ5の代理店の代理店番号、名前、予約数のリストが得られます。以下のSQL文を実行します。
SELECT TOP 5 SAGENCYDATA.AGENCYNUM, STRAVELAG.NAME,SAGENCYDATA.NUMBOOKINGS FROM SAGENCYDATA INNER JOIN STRAVELAG on SAGENCYDATA.AGENCYNUM = STRAVELAG.AGENCYNUM;
結果パネルでは、最も多くの予約を行っている旅行代理店が「Rainy, Stormy, Cloudy」で、合計27870件の予約があることがわかります。
アレックスは、トップ5の旅行代理店が最も予約を取る曜日も知りたいと考えているため、さらにいくつかのクエリを使用する必要があります。
トップの予約日を見つけるために、まず2つの新しいテーブルを作成します:
STOPAGENCY:トップ5の代理店による予約の名前、代理店番号、および数
SAGBOOKDAYS:各代理店ごとに1日に行われる予約の詳細
STOPAGENCY
はS+TOP(トップ)+AGENCY(代理店)、SAGBOOKDAYS
はS+BOOK(予約)+DAYS(日)とお考えください。
まず、以前のクエリの結果を新しいテーブルに保存することによって、STOPAGENCY
テーブルを作成します。以下のSQL文を実行します。
CREATE TABLE STOPAGENCY AS (SELECT TOP 5 SAGENCYDATA.AGENCYNUM, STRAVELAG.NAME,SAGENCYDATA.NUMBOOKINGS FROM SAGENCYDATA INNER JOIN STRAVELAG ON SAGENCYDATA.AGENCYNUM = STRAVELAG.AGENCYNUM);
以下のSQL文でSTOPAGENCY
の中身を確認します。
SELECT * FROM STOPAGENCY;
次に、各代理店の日々の予約を保存するためにSAGBOOKDAYS
テーブルを作成します。以下のSQL文を実行します。
CREATE TABLE SAGBOOKDAYS AS (SELECT AGENCYNUM, dayname(ORDER_DATE) as ORDERDAY, count(dayname(ORDER_DATE)) AS DAYCOUNT FROM SBOOK GROUP BY AGENCYNUM, dayname(ORDER_DATE))
以下のSQL文でSAGBOOKDAYS
の中身を確認します。
SELECT * FROM SAGBOOKDAYS;
2つのテーブルを作成したので、これらのテーブルを代理店番号(AGENCYNUM列)に基づいて結合します。また、トップ5の代理店のそれぞれについて、予約数が最も多い日を抽出する必要があります。以下のSQL文を実行します。
SELECT SAGBOOKDAYS.AGENCYNUM, STOPAGENCY.NAME, SAGBOOKDAYS.ORDERDAY, SAGBOOKDAYS.DAYCOUNT FROM SAGBOOKDAYS INNER JOIN STOPAGENCY ON SAGBOOKDAYS.AGENCYNUM=STOPAGENCY.AGENCYNUM WHERE SAGBOOKDAYS.DAYCOUNT IN (SELECT max(DAYCOUNT) FROM SAGBOOKDAYS GROUP BY AGENCYNUM)
これで、トップ5の代理店における予約の大部分が木曜日に行われていることがわかります。
以上になります。お疲れ様でした!