QlikViewのデータ型とデュアル値

QlikViewのデータ型とデュアル値

Pocket

今回はQlikViewの内部的な動作について説明いたします。
ほかの記事と違い、すぐに使える便利な機能の紹介ではありませんが、ここで紹介する「デュアル値」について理解しておくと、QlikViewを使いこなす上でいろいろと応用が利くようになります。

とくにQlikViewの中級者~上級者の方は、ぜひご覧ください。
また、ほかのBIツールやプログラミング言語の使用経験がある方にも、興味深い内容となっていると思います。

ここではまず、QlikViewのデータ型について説明し、つづいてQlikViewを理解する上で重要な「デュアル値」の概念について説明します。
後半部分ではデュアル値を使用するとどのようなことができるのか、使用例を紹介いたします。

なお、記事が長くなったため、本格的な使用例の紹介は、次回また別の記事にまとめさせていただきます。


QlikViewのデータ型

QlikViewにも、ほかのツールや言語とおなじように、文字列や数値、日付、時刻といったデータ型(データの種類)があります。
しかし、通常データ型を意識しなくてもQlikViewが自動的にうまく処理してくれます。

ツールや言語によっては、文字列を数値に変換する、文字列を日付に変換するといった”データ型の変換”を手動でおこなう必要がありますが、QlikViewではデータ型の変換を手動でおこなう機会は、ほとんどありません。

そのため、QlikViewにはデータ型がない(言い換えると、すべてのデータがほかの言語でいうところのバリアント型になっている)ように見えますが、正確に言うと少し違います。
QlikViewは「デュアル値」という独自の仕組みを使って、表面上データ型を意識しなくてもいいようにしています。

このデュアル値を理解することで、QlikViewの内部的な動作をより深く理解でき、またこれを使いこなすことで、さまざまな応用が利くようになります。

ここではまず、「デュアル値」という用語を覚えておいてください。


デュアル値とは?

それでは、デュアル値とはなんなのか説明していきます。
デュアル値とは、内部的に使用する数値と、画面上に表示する文字列を、セットにしたデータのことです。
数値の方は並べ替えや集計などの内部的な処理に使われ、文字列の方は画面上に表示するために使用されます。

普段QlikViewを使っている上で意識することはありませんが、QlikViewではチャートなどで使用する数値や日付は、実はすべてデュアル値になっています。
たとえば、チャート上に「¥1,000」という値が表示されていた場合、QlikViewの内部には数値の「1000」と、¥(円マーク)や,(カンマ)を付けた文字列の「¥1,000」が、セットになって保持されています。
これがデュアル値です。


文字列、数値、日付時刻の内部的な値

前述のとおりQlikViewの数値や日付は、内部的にはデュアル値になっていますが、文字列はデュアル値にはなっていません。
文字列は、内部的に使用する値と画面に表示する値がおなじであるため、単純に文字列の値が保持されています。

文字列、数値、日付、時刻について、内部的にどのような値を保持しているのか、まとめると以下のようになります。
  • 文字列
    単純に文字列を保持しています。(デュアル値にはなっていません。)
  • 数値
    「1000」「1500」「0.5」といった数値を保持しています。
    通貨記号や桁区切りの,(カンマ)などのつかない単純な数値です。
    たとえば、割合を表示する際は「50%」という文字列と、「0.5」という数値のデュアル値が保持されています。
  • 日付
    1899年12月30日を0として、この日からの経過日数を整数で保持しています。
  • 時刻
    0時0分0秒を0として、この時刻からの経過時間を小数で保持しています。
日付と時刻も内部的には数値であるという点を理解してください。
以下が例です。
画面上に表示する文字列内部的に保持する数値
1,0001000
¥1,5001500
50%0.5
1899/12/311
1900/01/012
1900/12/31366
00:00:000.00000
08:00:000.33333
12:00:000.50000
23:59:590.99999 ※1
1900/01/01 12:00:002.50000 ※2
※1
浮動小数の問題があるため、ちょうど0.99999になる訳ではありません。たとえば小数第6位まで表示すると0.999988といった値になります。しかし小数第5位までの表示であれば0.99999になります。

※2
日付と時刻を組み合わせた値は、日付が整数部分に、時刻が小数部分になります。


デュアル値の確認

それでは、ここまでの内容をQlikViewで確認してみましょう。
ここではデータの取り込みはおこなわずに、Today関数などを使用して動作を確認します。
詳細な手順は省きますが、ぜひ一緒に試してみてください。

ドキュメントを新規に作成してください。
シートの余白を右クリック→[シートオブジェクトの追加]→[チャート]を選択します。
qlikview-data-type-and-dual-value-101
[ストレートテーブル]を選択して[次へ]ボタンをクリックします。
qlikview-data-type-and-dual-value-102
軸はなにも設定しないため、そのまま[次へ]ボタンをクリックします。
qlikview-data-type-and-dual-value-103
数式に以下のように指定し、[OK]ボタンをクリックします。
Today()
qlikview-data-type-and-dual-value-104
[数式]画面で[完了]ボタンをクリックします。
qlikview-data-type-and-dual-value-105Today関数により、今日の日付が表示されました。
下図は2014年1月15日の実行結果です。
qlikview-data-type-and-dual-value-106
それでは、この日付が内部的に保持している数値を確認してみましょう。

チャートのプロパティを開き、[数値書式]タブを開きます。
[数値]を選択して、[OK]ボタンをクリックします。
qlikview-data-type-and-dual-value-107
「41,654」といった数値が表示されます。
これが内部的に保持している数値です。
今日(ここでは2014年1月15日)は、1899年12月30日の41,654日後ということになります。
qlikview-data-type-and-dual-value-108
今日の日付だと分かり難いため、別の値でも試してみましょう。
チャートのプロパティを開き[数式]タブで、[追加]ボタンをクリックします。
qlikview-data-type-and-dual-value-109
数式に以下のように指定します。
'1899/12/31'
qlikview-data-type-and-dual-value-110qlikview-data-type-and-dual-value-111
日付が表示されました。
qlikview-data-type-and-dual-value-112
この日付を数値で表示してみます。
qlikview-data-type-and-dual-value-113
数値で表示すると「1」と表示されます。
日付は1899年12月30日からの経過日数で保持されているため、1899年12月31日の値は「1」になります。
qlikview-data-type-and-dual-value-114
こんどは時刻の値を試してみましょう。
チャートに以下の数式を追加します。
Now()
qlikview-data-type-and-dual-value-115
現在の日付時刻が表示されました。
qlikview-data-type-and-dual-value-116
この日付時刻を数値で表示してみます。
時刻は小数で保持しているため、[実数]を選択します。
[小数点以下の桁数]に、ここでは「5」と指定します。
qlikview-data-type-and-dual-value-117
日付時刻が数値で表示されました。
整数部分は「41,654」で、Today関数の結果とおなじです。
小数部分は時刻をあらわしており、下図では約0.47になっています。12時が0.5ですので、だいたい11時ごろということになります。
qlikview-data-type-and-dual-value-118
こちらも、現在の日付時刻だと分かり難いため、別の値で試してみましょう。
チャートに以下の数式を追加します。
'12:00:00'
qlikview-data-type-and-dual-value-119qlikview-data-type-and-dual-value-120
さきほどとおなじように、実数で表示してみます。
qlikview-data-type-and-dual-value-121
「0.50000」と表示されました。
12時は1日のちょうど半分なので、値は0.5になります。
qlikview-data-type-and-dual-value-122


デュアル値を演算で使用する

つづいて、デュアル値を演算で使用すると、どうなるのか試してみましょう。
チャートに以下の数式を追加します。
Today() + 1
qlikview-data-type-and-dual-value-201
そのままだと、下図のように「41655」といった数値で表示されます。
qlikview-data-type-and-dual-value-202
書式を日付に変更すると、日付書式で表示できます。
qlikview-data-type-and-dual-value-203
「Today() + 1」の指定により、明日の日付がもとめられました。
ここでは2014年1月15日の翌日なので、2014年1月16日と表示されています。
qlikview-data-type-and-dual-value-204
このように日付は内部的には、基準日からの経過日数を保持しているため、単純に足し算、引き算すれば、日付の加減算ができます。
当然12月31日に+1すると、翌年の1月1日になります。

ただし、これは”日”の加減算だからできることであって、月や年の加減算をするには(たとえば1ヶ月後の日付をもとめたい場合は)、AddMonths関数やAddYears関数が必要になります。


こんどは、日付に対して文字列の演算をしてみましょう。
チャートに以下の数式を追加します。
'今日の日付' & Today()
「&」は文字列を連結するための演算子です。
qlikview-data-type-and-dual-value-205
「今日の日付」のうしろに、Today関数の結果を連結して表示できました。
qlikview-data-type-and-dual-value-206
Today関数の結果に対して、数値演算と文字列演算を両方試しましたが、どちらもエラーなどは表示されず、期待どおりに動作したと思います。
これもデュアル値の大きな特長の一つです。

デュアル値を演算で使用する場合、文字列と数値のどちらか適切な方が自動的に選択されます。

Today() + 1 → 内部的に保持する数値に「+1」する。
‘今日の日付’ & Today() → 画面に表示する文字列の前に「今日の日付」を連結する。

このように、数値演算では内部的に保持する数値が使用され、文字列演算では画面に表示する文字列が使用されます。
この特長により、QlikViewではデータ型を意識することなく、演算ができます。

ほかのツールや言語に慣れている方には、暗黙的にデータ型が変換されている、もしくはQlikViewにはデータ型がないように感じられると思いますが、正確に言うと文字列と数値の両方を保持しており、どちらか適切な方が自動的に選択されているという動作になります。


Dual関数

前述のとおりデュアル値はQlikViewが自動的に生成していますが、Dual関数という関数を使用することで、独自のデュアル値を作成することもできます。
Dual関数は以下のように指定します。
Dual(画面に表示する文字列, 内部的に保持する数値)

Dual関数の使用例(並び順を制御する)

Dual関数はさまざまな用途で使用できますが、もっともよくある例は、並び順を制御するというものです。
たとえば、地区名と地区番号という項目があったときに、画面上には地区名を表示して、並び順は地区番号順にしたい場合があると思います。

このような場合、[ソート]タブの[数式]を使用することでも並び順を制御できます。
リストボックスの項目は「地区名」にします。
qlikview-data-type-and-dual-value-401
[ソート]タブで[数式]にチェックを入れ、「地区番号」を指定します。
qlikview-data-type-and-dual-value-402qlikview-data-type-and-dual-value-403
しかし、ロードスクリプトで以下のようなデュアル値を作成しておけば、手動で[ソート]タブの設定をしなくても、自動的に表示は地区名、並べ替えは地区番号順にできます。
Dual(地区名, 地区番号) as 地区デュアル値,
qlikview-data-type-and-dual-value-404qlikview-data-type-and-dual-value-405ただし、デュアル値は内部的には数値であるため、データが右揃えで表示されます。
これは、[プレゼンテーション]タブの設定で変更できます。
qlikview-data-type-and-dual-value-406qlikview-data-type-and-dual-value-407
[設定]→[ドキュメントプロパティ]→[プレゼンテーション]タブから設定すれば、項目ごとの配置について、ドキュメント全体での初期値を変更できます。
qlikview-data-type-and-dual-value-408

Dual関数のその他の使用例

Dual関数を使用すれば、画面上の表示と内部的な値を制御できるため、並び順を制御する以外にもさまざまな応用ができます。
たとえば、チャートに表示するラベルも自由に制御できます。

下図では、積み上げ棒グラフの中に、軸項目である年の値を表示しています。
Dual(年, Sum(売上金額))
qlikview-data-type-and-dual-value-502
下図では、軸項目の値である地区名を凡例に表示するかわりに、折れ線の右端に表示しています。
qlikview-data-type-and-dual-value-501
下図では、棒グラフの上に、売上金額の順位と集計値を両方表示しています。(1,2,3,4,5というのが順位です。)
qlikview-data-type-and-dual-value-503
このようにDual関数を使用することで、さまざまなカスタマイズができます。
詳細は後日また別の記事にまとめたいと思います。


補足説明

ここまで、デュアル値についてご覧いただきましたが、QlikViewでは関数の結果もデュアル値になっていることがあります。
たとえば、Rank関数の結果はデュアル値になっています。

[数式の編集]画面で、ポップアップで表示されるRank関数のヘルプを見ると、結果をデュアル値で返すことが確認できます。
qlikview-data-type-and-dual-value-306
Rank関数を使用していて同率順位があった場合、下図のように「6-7」といった表示になります。
※この表示はRank関数の設定により変更できます。
qlikview-data-type-and-dual-value-301
数値の表示に変更してみます。
qlikview-data-type-and-dual-value-303
下図のように、内部的には順位の下限値を数値で保持していることが分かります。
※この値もRank関数の設定により変更できます。
qlikview-data-type-and-dual-value-304
Excelなどで試すと分かりますが、1,2,3…といった数値と、「6-7」のような文字列が混在している場合、並べ替えがうまくできません。
qlikview-data-type-and-dual-value-305
QlikViewでは内部的に保持する数値の方で、並べ替えがおこなわれるため、Rank関数の結果はきれいに順位の順番になっています。


振り返り

今回はQlikViewのデータ型とデュアル値についてご覧いただきました。
以下に重要なポイントをまとめます。
  • デュアル値
    • 内部的に使用する数値(並べ替えや集計などで使用)と、画面上に表示する文字列を、セットにしたデータのこと。
    • チャートなどで使用する数値や日付は、すべてデュアル値。
    • 演算で使用する場合、数値演算なら内部的に保持する数値が、文字列演算なら画面に表示する文字列が自動的に選択される。
  • 日付と時刻
    • 日付と時刻も内部的には数値。
    • 日付は、1899年12月30日を0として、この日からの経過日数を整数で保持している。
    • 時刻は、0時0分0秒を0として、この時刻からの経過時間を小数で保持している。
  • Dual関数
    • Dual関数により独自のデュアル値を作成できる。
      Dual(画面に表示する文字列, 内部的に保持する数値)
    • Dual関数は、並び順を制御する、チャートのラベルを制御するなど、さまざまな用途で使用できる。


最後に…

今回はQlikViewのデータ型と、デュアル値についてご覧いただきましたが、デュアル値のような機能は、ほかのツールや言語ではあまり見たことがありません。

内部的に使用する数値と、画面に表示する文字列をセットで保持しておく、という非常に簡単な仕組みですが、非常によくできた仕組みではないでしょうか。

企業のデータには並び順やデータの意味が、慣例的に決まっているものが数多くあります。
たとえば、期(上期、下期)やサイズ(SML)などには、常識的な並び順がありますし、部署や地域なども企業内で慣例的な並び順があると思います。

また、データベースに数値で格納されているステータスやフラグに、企業独自の意味があることも多いと思います。(たとえばステータス5は完了、フラグ1は対応済みをあらわすなど。)

このように慣例的な並び順や意味がある以上、内部的に使用する数値と画面に表示する文字列の組み合わせで、データを持たせておくと便利な場面というのは多々あります。

冒頭で申し上げたとおり、デュアル値とDual関数には、今回ご覧いただいた使用例以外にも、さまざまな応用例がありますので、詳細は次回また別の記事にまとめたいと思います。

お疲れ様でした。