BIツールでおなじみのドリルダウン。
大分類ごとの売上 → 大分類・中分類ごとの売上 → 大分類・中分類・小分類ごとの売上 のようにどんどんと細かい情報にしてデータ分析をする方法です。
この機能を使いたいのにデータが階層ごとになっていないからうまくできない、ということはございませんか?
この記事ではカラム内の文字列の中で特定の文字列で分割して、階層項目をつくるという内容です。
便利な技術なのでぜひご覧になってください。
階層テーブルでドリルダウンをする
このドリルダウンはホームページのURLを階層にして表示させています。pagePath1 → pagePath2 → pagePath3 と詳細にドリルダウンしていますね。
このドリルダウンを実現するためにはpagePath1、pagePath2、pagePath3という項目が必要です。
ひとつの項目にフルパスが入っている場合が多い
しかしこのように階層構造となっているテーブルはなかなかなく、下図のように1つの項目にフルパスで入っていることが多いです。
Page URLはスラッシュ(/)で区切られています。こちらをpagePath1、pagePath2・・・のように分解していきます。
それではデータを加工していきましょう。
今回はDS Scriptをつかってデータを加工します。
SQLで同様の処理を実現したい場合は、SQL編の記事をご参照ください。
元となるテーブル
今回のサンプルとなるテーブルはこちらです。[アクセスログb]というテーブルです。PageURLにフルパスのデータが入っています。
pagePath1からpagePath10までの項目にスラッシュ区切りの文字列を入れていき、階層数にはスラッシュの数が入りるようにレコードが更新されます。
もしAテーブルからBテーブルに取り込みたいのなら
[アクセスログ]テーブルにデータ加工前のデータが入っていて、[アクセスログb]テーブルにデータを加工してレコード挿入したい場合は以下の記事を参照してください。
DS Scriptをつかってデータ加工をする
今回使用するスクリプトはこちらです。
SET() {
// 区切り文字
$CONST_SEPARATOR := "/";
// 区切り文字最大
$CONST_MAX_ELEMENT_COUNT := "10";
// データベース名(引数が未指定の場合の値を指定)
$VAR_DB_NAME := "work";
// テーブル名(引数が未指定の場合の値を指定)
$VAR_TABLE_NAME := "アクセスログb";
// 分割元カラム名(引数が未指定の場合の値を指定)
$VAR_SRC_COLUMN_NAME := "PageURL";
// 分割先カラム名(引数が未指定の場合の値を指定)
$VAR_DEST_COLUMN_NAME := "pagePath";
}
SESSION_CONNECT ($VAR_DB_NAME) {
SET_CURSOR() {
// 分割したいカラムとUPDATEのためROWIDを取得する
@VAR_CURSOR(ROWID, SrcColumn) = SELECT ROWID, ${VAR_SRC_COLUMN_NAME} FROM ${VAR_TABLE_NAME};
}
FOREACH (@VAR_CURSOR) {
SET() {
// 区切り文字を空文字に置き換えて文字列長の差分を算出する(/level1/level2/level3だと3になる)
$VAR_ELEMENT_COUNT = LENGTH($VAR_CURSOR_SrcColumn) - LENGTH(REPLACE($VAR_CURSOR_SrcColumn, $CONST_SEPARATOR, ""));
// UPDATE文
$VAR_UPDATE_SQL = CONCAT("UPDATE ", $VAR_TABLE_NAME, " SET ","階層数 = ",$VAR_ELEMENT_COUNT,", ");
}
// 区切り文字の数がゼロだったら何もしない
CONTINUE ($VAR_ELEMENT_COUNT <= 0) {
}
SET() {
$VAR_ITERATOR = 1;
}
// 区切り文字の数をループする
LOOP ($VAR_ELEMENT_COUNT) {
CASE {
// 2つめ以降ならカンマを追加する
WHEN ($VAR_ITERATOR > 1) {
SET() {
$VAR_UPDATE_SQL = CONCAT($VAR_UPDATE_SQL, ",");
}
}
}
SET() {
// "/level1/level2/level3" を"level1" "level2" "level3"に分割して取得する
$VAR_ELEMENT = CONCAT("/", SPLIT_PART($VAR_CURSOR_SrcColumn, $CONST_SEPARATOR, $VAR_ITERATOR + 1));
// COL[n] = valueの形式
$VAR_UPDATE_SQL = CONCAT(
$VAR_UPDATE_SQL,
$VAR_DEST_COLUMN_NAME,
$VAR_ITERATOR,
"='",
$VAR_ELEMENT,
"'");
// 次の要素へ
$VAR_ITERATOR = $VAR_ITERATOR + 1;
}
// 最大数を超えたら終了
BREAK ($VAR_ITERATOR > $CONST_MAX_ELEMENT_COUNT) {
}
}
SET() {
// WHEREにROWIDを付与する
$VAR_UPDATE_SQL = CONCAT($VAR_UPDATE_SQL, " WHERE ROWID=", $VAR_CURSOR_ROWID);
}
SQL($_SQL_AUTO_COMMIT_OFF) {
// UPDATEを実行する
${VAR_UPDATE_SQL};
}
}
SQL($_SQL_AUTO_COMMIT_OFF) {
// 最後にコミットする
COMMIT;
}
}
実際のサンプルプログラムはこちらからダウンロードできます。
上記のスクリプトを流すと、[アクセスログ]に以下のようにデータが入ります。
ちゃんと階層構造になりましたね。
この状態になればドリルダウンをすることが可能です。
ダウンロードしたdhnファイルを自社の環境に適用する方法
dhnファイルをダウンロードしたら、ファイルを開いて7行目と9行目のデータベース名とテーブル名を自社の環境のデータベースとテーブルに変更します。
そしてScript Editorを開き、左下のスクリプトファイルを右クリックし[アップロード]から該当のdhnファイルを取り込みます。
[実行]をしてみて、エラーが出ないことを確認したら、dhnファイルを保存しましょう。
これで自社環境でサンプルスクリプトを使用することができます。
DS Scriptをバッチから呼び出して自動化しよう
バッチでdhnファイルを呼び出し、DS Scriptを動かしましょう。
DS Scriptのバッチからの起動方法についてはこちらの記事を参照してください。
BIツールのパフォーマンスを最大限に活かすには、元データを使いやすい形に加工することも重要です。
SQLを理解して、データ加工の技術を身に着けていきましょう。