Dual関数の使用例

Dual関数の使用例

Pocket

前回はQlikViewのデータ型とデュアル値について、そしてデュアル値を作成するDual関数の基礎ついてご覧いただきました。
今回はDual関数のさまざまな使用例を見ていきましょう。


Dual関数の構文

まず、Dual関数の指定方法を簡単におさらいしておきます。
Dual関数は以下のように指定します。
Dual(画面に表示する文字列, 内部的に保持する数値)
画面上には「画面に表示する文字列」の方が表示され、集計や並べ替えなど内部の演算には「内部的に保持する数値」の方が使用されます。


並び順や集計処理を制御する


文字列の項目と、数値の項目の組み合わせ

前回の記事でもご覧いただきましたが、Dual関数のもっともよくある使用例は、文字列の項目と数値の項目を組み合わるというものです。
たとえば、地区名(日本語の文字列)と地区番号(数値)のデータがあったとします。
この場合は、以下のようなデュアル値を作成することで、画面上には地区名を表示し、並び順は地区番号順にできます。
Dual(地区名, 地区番号) as 地区
dual-function-example-101

有限個の文字データ

期(上期下期)、サイズ(SML)、性別(男女)のように、あらかじめ決まった値しかもないものは、デュアル値にしておくと便利です。
たとえば、期(上期下期)の項目があったとします。
単純に期で並べ替えると、下期→上期の順になります。
※文字列で並べ替えると文字コード順に並べ替えられますが、漢字の文字コードは音読みのアイウエオ順に振られていることが多いため、下(ゲ)と上(ジョウ)では下(ゲ)の方が先にきます。

この場合は、以下のように上期に0、下期に1を割り当てたデュアル値を作成するとよいでしょう。
If(Month(日付) < 7, Dual('上期', 0), Dual('下期', 1)) as 期
dual-function-example-102

グループ化された数値データ

グループ化された数値に関しても、デュアル値にしておくと便利です。
たとえば、金額の項目を「5000円未満」「5000円以上」「1万円以上」の3つにグループ化していたとします。
「以上」と「未満」を文字列で並べ替えると、以上→未満の順になります。
※以(イ)と未(ミ)では以(イ)の方が先にきます。

この場合は、以下のようなデュアル値を作成するとよいでしょう。
前述の期の例のように、0,1,2...と連番を割り当ててもいいのですが、数値の下限値(または上限値)を割り当てておくと、より柔軟です。
If(販売単価 < 5000, Dual('5千円未満', 0),
  If(販売単価 < 10000, Dual('1万円未満', 5000),
    Dual('1万円以上', 10000))) as 販売単価グループ
dual-function-example-103

順序のある文字データ

ステータス(業務の進捗状況)や、なにかのランクなど、順序のある文字データもデュアル値にしておくと便利です。
たとえば、業務の進捗状況をあらわす以下のようなデータがあったとします。
受付→確認中→受理済→処理中→対応済

この場合は、以下のようなデュアル値を作成するとよいでしょう。
Dual(ステータス名, ステータス番号) as ステータス
dual-function-example-104ステータスの順に並べ替えられるのは、いままでとおなじです。
さらに、内部的に数値を保持しているため、以下のように3(受理済)以下といった条件で値を絞り込めます。
dual-function-example-105
Dual関数とは直接関係ありませんが、もしステータス名のみ、ステータス番号のみしかない場合は、Match関数やPick関数が便利です。
Match関数は文字列を連番に置き換える関数です。
Match(ステータス名, '受付', '確認中', '受理済', '処理中', '対応済') as ステータス番号
Pick関数は連番を文字列に置き換える関数です。
Pick(ステータス番号, '受付', '確認中', '受理済', '処理中', '対応済') as ステータス名

フラグのデータ

完了フラグ(完了か完了でないか)、削除フラグ(削除か削除でないか)など、二つの値を持つフラグのデータも、デュアル値にしておく便利です。
たとえば、完了フラグ(対応中、完了)と重要フラグ(通常、重要)があったとします。
この場合は、以下のようなデュアル値を作成するとよいでしょう。
Dual(完了フラグ名, 完了フラグ番号) as 完了フラグ
Dual(重要フラグ名, 重要フラグ番号) as 重要フラグ
dual-function-example-106フラグの順に並べ替えられるのは、いままでとおなじです。
さらに、Sum(フラグ)という簡単な数式で件数が数えられます。
完了したものの件数や、重要なものの件数は以下の数式でもとめられます。
※完了でないものの件数は、全体の件数から完了したものの件数を引いてもとめています。
もとめる値数式
完了Sum(完了フラグ)
完了でないCount(完了フラグ) - Sum(完了フラグ)
重要Sum(重要フラグ)
重要でないCount(重要フラグ) - Sum(重要フラグ)
dual-function-example-107もちろん、デュアル値にしなくても、If関数などを使用すれば件数をもとめられますが、単純にSumで集計する方が簡単です。
If(完了フラグ名 = '完了', 1, 0) as 完了数

さらに、ビット演算を使用すると、完了かつ重要なものの件数などを以下の演算でもとめられます。
もとめる値数式
完了かつ重要Sum(完了フラグ bitand 重要フラグ)
完了または重要Sum(完了フラグ bitor 重要フラグ)
完了で重要でないSum(完了フラグ bitor 重要フラグ) - Sum(重要フラグ)
重要で完了でないSum(完了フラグ bitor 重要フラグ) - Sum(完了フラグ)
dual-function-example-108
「bitand」はビット積、「bitor」はビット和をあらわします。
0 bitand 0 = 0
0 bitand 1 = 0
1 bitand 0 = 0
1 bitand 1 = 1
0 bitor 0 = 0
0 bitor 1 = 1
1 bitor 0 = 1
1 bitor 1 = 1


チャートの表示をカスタマイズする


棒グラフの中に凡例の値を表示する

チャートの中には、通常数式の値(Y軸の値)のみ表示できますが、Dual関数を使用すれば下図のように、チャートの中に凡例の値を表示できます。
dual-function-example-201
このチャートは以下のように作成しています。
[軸]タブで、「分類名1」と「年」を軸項目に設定します。
[数式]タブで以下の数式を指定します。
Dual(年, Sum(売上金額))
さらに[データ点の値]にチェックを入れます。
dual-function-example-202
[スタイル]タブで[形式]を[積み上げ]に変更します。
dual-function-example-203
[基本設定]タブで[チャートにタイトルを表示する]のチェックをはずして、チャート上部に表示されるタイトル(初期設定では数式)を非表示にします。
dual-function-example-204
[プレゼンテーション]タブで[凡例の表示]のチェックをはずして、凡例を非表示にします。
さらに[要素の中に値を表示]にチェックを入れて、値を棒グラフの中に表示します。
dual-function-example-205

グラフの中に複数の数値データを表示する

チャートの中には、通常数式の値を一つのみ表示できますが、Dual関数を使用すれば下図のように、チャートの中に複数の値を表示できます。
dual-function-example-206
このチャートは以下のように作成しています。
[軸]タブで、「分類名1」を軸項目に設定します。
[数式]タブで以下の数式を指定します。
Dual(
  Rank(Sum(売上金額)) & Chr(13) & Chr(10) & Sum(売上金額),
  Sum(売上金額)
)
Rank関数とSum関数を使用して、順位と合計値を計算しています。間にある「Chr(13) & Chr(10)」は改行コードをあらわします。
これにより、Rank関数の結果とSum関数の結果を改行して表示できます。

さらに、以下の設定によりデータ点を表示したり、凡例などを非表示にしています。
これらは一つ目の例とおなじですので、詳細は割愛します。
[数式]タブで[データ点の値]にチェックを入れます。
[基本設定]タブで[チャートにタイトルを表示する]のチェックをはずします。
[プレゼンテーション]タブで[凡例の表示]のチェックをはずします。

折れ線グラフの中に凡例の値を表示する

これは一つ目の例の応用ですが、折れ線グラフで折れ線の右端のみに、凡例の値を表示しています。
下図のようにラベルの表示が重なって、見難くなってしまうこともありますが、凡例の表示領域を節約できるという意味ではよい方法だと思います。
※この例は以下のブログを参考にさせていただきました。
Qlik Tips: Lose the Legend in Line Charts
dual-function-example-207
このチャートは以下のように作成しています。
[軸]タブで、「月」と「地区名」を軸項目に設定します。
[数式]タブで以下の数式を指定します。
Dual(
  If(月 = Max(TOTAL 月), 地区名, ''),
  Sum(売上金額)
)
If関数を使用して、月が最大値のときのみ「地区名」を表示しています。
これにより、折れ線の右端のみに「地区名」が表示されます。

さらに、以下の設定によりデータ点を表示したり、凡例などを非表示にしています。
これらは前二つの例とおなじですので、詳細は割愛します。
[数式]タブで[データ点の値]にチェックを入れます。
[基本設定]タブで[チャートにタイトルを表示する]のチェックをはずします。
[プレゼンテーション]タブで[凡例の表示]のチェックをはずします。

もし、折れ線の左端のみに地区名を表示したい場合は、上記の数式のMax関数をMin関数に置き換えます。
Dual(
  If(月 = Min(TOTAL 月), 地区名, ''),
  Sum(売上金額)
)
dual-function-example-208


最後に...

今回はデュアル値の使用例をご覧いただきました。
なるべく多くの具体例を挙げたつもりですが、ほかにもさまざまな使用例があると思います。
データの並び順や集計処理、チャートの表示をカスタマイズしたいときは、デュアル値を使えないか考えてみてください。
もしこの記事の内容を実際に試したい場合は、以下からファイルをダウンロードしてください。

お疲れ様でした。


今回使用したサンプルデータとロードスクリプト

今回使用したサンプルデータ(Excel)とロードスクリプトです。
dual-function-example.zip
以下のファイルが含まれています。
  • デュアル値サンプル.xls
    今回使用したサンプルデータです。もしこの記事の内容を実際に試したい場合は、こちらをお使いください。
  • デュアル値サンプル.txt
    完成版のロードスクリプトです。
  • 売上実績.xls
    「デュアル値サンプル.xls」の生成時に使用した元データです。
  • 売上実績.txt
    「デュアル値サンプル.xls」の生成時に使用したロードスクリプトです。
    今回、ステータスや完了フラグというデータを使用しましたが、これらはちょうどいいサンプルデータがなかったため、ほかで使用していたサンプルデータ(売上実績.xls)をもとに、乱数(Rand関数)で生成しました。
    Dual関数とは直接関係ありませんが、なにかの役に立つかもしれませんので、まとめて入れておきました。