QlikのValueloopのヒミツ

こんにちは!YOKOです。
1週間サボってしまいましたが、他のメンバーがしっかり書いてくれているようで😅
前回、Qlikでデータがないものは表示できない?いやデキルを書きましたが、あるプロジェクトで「完璧なやり方 〜データにないパターンの値を作成する」でやったところ、計算が重くて表示に時間がかかることが判明。違うアプローチも検討することに…

という事情で、今回はValuelistValueloopを使う方法を検討してみます。

目次

元データの確認

まず、前回のブログで作成したチャートの確認です。
0〜23の時間帯をデータのない時間帯も含めて表示をするのが目的でした。

Valuelistを使って表示

既にご存知の方も多いと思いますが、軸でValuelistを使用すると、Valuelist内で定義した軸の値を作成することができます。
最もシンプルな例は、こちらです。

設定項目定義
=Valuelist(‘金額’,’件数’)
メジャー=If(Valuelist(‘金額’,’件数’)=’金額’,Sum(金額),
If(Valuelist(‘金額’,’件数’)=’件数’,Count(Distinct 伝票番号))

上記はIf文で書きましたが、Valuelist内の値が多くなると、If文がネストされてわかりにくくなるので、以下のようのPick, Matchと組み合わせて使うことが多いです。

  • 軸     =Valuelist(値リスト)
  • メジャー   =Pick(Match(Valuelist(値リスト),値リスト),値1の数式,値2の数式, 値3の数式… )
設定項目定義
=Valuelist(‘金額’,’件数’)
メジャー=Pick(Match(Valuelist(‘金額’,’件数’),’金額’,’件数’),
Sum(金額),
Count(Distinct 伝票番号)
)

以上、おさらいでした。
この方法で実装してみますね。
軸は Valuelist(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23) です。
メジャーの数式は、こんなふうになりますね。

Pick(Match(Valuelist(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23)
,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23),
Sum({$<時刻={0}>} [回数]),
Sum({$<時刻={1}>} [回数]),
Sum({$<時刻={2}>} [回数]),
Sum({$<時刻={3}>} [回数]),
Sum({$<時刻={4}>} [回数]),
Sum({$<時刻={5}>} [回数]),
Sum({$<時刻={6}>} [回数]),
Sum({$<時刻={7}>} [回数]),
Sum({$<時刻={8}>} [回数]),
Sum({$<時刻={9}>} [回数]),
Sum({$<時刻={10}>} [回数]),
Sum({$<時刻={11}>} [回数]),
Sum({$<時刻={12}>} [回数]),
Sum({$<時刻={13}>} [回数]),
Sum({$<時刻={14}>} [回数]),
Sum({$<時刻={15}>} [回数]),
Sum({$<時刻={16}>} [回数]),
Sum({$<時刻={17}>} [回数]),
Sum({$<時刻={18}>} [回数]),
Sum({$<時刻={19}>} [回数]),
Sum({$<時刻={20}>} [回数]),
Sum({$<時刻={21}>} [回数]),
Sum({$<時刻={22}>} [回数]),
Sum({$<時刻={23}>} [回数])
)

きちんと表示できています。
けど、長すぎる😅
Valuelistで、0,1,2,3,4….. って列記していくのはスマートではないですよね?

Valueloopで実装

0,1,2,3,4…..と列記しないために、Valueloopを使ってみます。
理想的な定義は、軸で Valueloop(0,23)として、メジャーを以下のように設定

=Pick(Valueloop(0,23),
Sum({$<時刻={0}>} [回数]),
Sum({$<時刻={1}>} [回数]),
.
.
Sum({$<時刻={23}>} [回数])
)

本当は、Sum({$<時刻={$(=Valueloop(0,23))}>} 回数) とかでできるといいんだけどなあ…それはできません🥲
表示は以下となります。

あれれ?よく見るとずれてませんか?
できているようで、1時間ずつずれて表示されています。
軸で指定したValueloop(0,23)とメジャーのValueloop(0,23)のインデックスは同期していないようです。
これって、不具合?仕様?
Qlikさんに聞いたら「仕様です」って言われるんだろうなあ…
回避策はこうですね。

Pick(Match(Valueloop(0,23),0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23),
Sum({$<時刻={0}>} [回数]),
Sum({$<時刻={1}>} [回数]),
.
.
Sum({$<時刻={23}>} [回数])
)

なんやねん。結局、0,1,2,3… って書くしかないんかい!
どうしても、0,1,2,3… と書きたくないのなら、こういう書き方もあります。

=Pick(Match(Valueloop(0,23),$(=Concat(Valueloop(0,23),',',Valueloop(0,23)))),
Sum({$<時刻={0}>} [回数]),
Sum({$<時刻={1}>} [回数]),
Sum({$<時刻={2}>} [回数]),
.
.
Sum({$<時刻={23}>} [回数])
)

でも、面倒くさい数式ですね😂
これなら、0,1,2,3… って入力したほうがマシかもしれません。
0,1,2,3…と入力した場合も、$(=Concat(Valueloop(0,23),’,’,Valueloop(0,23))で指定した場合も、結果は以下のとおりとはなりますが…

Valueloopの使い道ってなんだろう

使えそうでイマイチなValueloopですが、誰か「こうやって使うんだよ!」って教えてほしいものです。
考えてみたら、あまり使った経験がないかもしれません。
唯一使っているのは、こういうところですかねえ…
Variable Inputのドロップダウンで、こういう指定をする。

=Concat(Valueloop(0,23),'|',Valueloop(0,23))

これは少しスマートではありますねえ。
でも、何だかなあ…
気分は未だ晴れません。

まとめ

Qlikで「データがないものは表示できない」と思ったら、Valuelistで無理やり作りましょう。
Valueloopも使えますが、色々と問題あります。「できた!」と思っても、インデックスがずれますので、安心しないように!
最後に以下の点にも留意して下さい。

  • ValuelistにしてもValueloopにしても軸は選択できない
  • 0〜23をValuelist, Valueloopした場合、内部的には24回計算するため、表示が遅くなるのは否めない

いずれにしても、データがないものは表示するのは大変ですね。
ではまた!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次