こんにちは!YOKOです。
1週間サボってしまいましたが、他のメンバーがしっかり書いてくれているようで😅
前回、Qlikでデータがないものは表示できない?いやデキルを書きましたが、あるプロジェクトで「完璧なやり方 〜データにないパターンの値を作成する」でやったところ、計算が重くて表示に時間がかかることが判明。違うアプローチも検討することに…
という事情で、今回はValuelistやValueloopを使う方法を検討してみます。
元データの確認
まず、前回のブログで作成したチャートの確認です。
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回計算するため、表示が遅くなるのは否めない
いずれにしても、データがないものは表示するのは大変ですね。
ではまた!


