TECH BLOG

MENU

オンプレクラウド

Dr.Sum

Dr.Sum

 

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;
    }

}

実際のサンプルプログラムはこちらからダウンロードできます。

SPLIT_URL.dhnをダウンロードする

 

上記のスクリプトを流すと、[アクセスログb]に以下のようにデータが入ります。

 

ちゃんと階層構造になりましたね。

この状態になればドリルダウンをすることが可能です。

 

ダウンロードしたdhnファイルを自社の環境に適用する方法

dhnファイルをダウンロードしたら、ファイルを開いて7行目と9行目のデータベース名とテーブル名を自社の環境のデータベースとテーブルに変更します。

そしてScript Editorを開き、左下のスクリプトファイルを右クリックし[アップロード]から該当のdhnファイルを取り込みます。

 

[実行]をしてみて、エラーが出ないことを確認したら、dhnファイルを保存しましょう。

これで自社環境でサンプルスクリプトを使用することができます。

DS Scriptをバッチから呼び出して自動化しよう

バッチでdhnファイルを呼び出し、DS Scriptを動かしましょう。

DS Scriptのバッチからの起動方法についてはこちらの記事を参照してください。

 

 

BIツールのパフォーマンスを最大限に活かすには、元データを使いやすい形に加工することも重要です。

SQLを理解して、データ加工の技術を身に着けていきましょう。

 

 

 

この記事にリアクションしてみませんか?

  • 分かりやすい (2)
  • 問題が解決した (0)
あなたのお役に立ててうれしいです!
プロフィールへ

Toru Sasahara

Dr.Sumのソースコード1行目から開発に携わり、四半世紀にわたってDr.Sumと共に歩んできました。 2022年からはDr.Sumの開発責任者とプロダクトエンゲージメント担当を兼務し、ユーザーが愛着を持ち、長く使い続けられる製品の開発に情熱を注いでいます。

Related article

Related article関連記事

Pick up

Pick upおすすめ記事

【まとめ】SVFCloud帳票をinvoiceAgentに連携する方法

  • #帳票作成・出力
  • #システム連携
  • #電帳法
  • #文書定義
  • #処理定義

2024.04.18

SVF

Dr.Sum Copilotをインストールしてみた【OpenAI】

  • #Copilot

2024.04.05

Dr.Sum

特定の文字列で分割して階層構造をつくりたい!~DS Scriptで分割する~1

  • #データ加工
  • #DS Script

2023.07.17

Dr.Sum

Ranking

Rankingランキング

1

Excelのデータを加工したい。~変換(横持ち⇔縦持ち)について~

  • #データ取り込み
  • #データ加工

2021.01.19

Dr.Sum

2

Dr.Sum Copilotをインストールしてみた【OpenAI】

  • #Copilot

2024.04.05

Dr.Sum

3

【Excelの取り込み】データベースにExcelデータをインポートしよ…

  • #データ取り込み

2020.08.14

Dr.Sum

Info

Information

ウイングアーク1stからのお知らせ