Qlikのソート順がヘン!でも大丈夫。

こんにちは!Yokoです。
会社の合宿で福岡に来ております!
木曜日はもつ鍋、金曜日は水炊き、そして今日はラーメンです。
お腹キツイ😅

木曜日にお客様から、「このソート順なんとかならない?」って言われ、「あ〜、それはQlikの仕様なので、そうなっちゃうんですよ。でも裏技で何とかしますっ!」って答えました。
どういう問題かというと、フィールドのデータ型が混在してしまった時に起きるソート問題です。

目次

Qlikではデータから自動的にデータ型を決定する

Qlik Senseはデータをロードするタイミングで、データ型を判定します。
これはこれで便利ではあるのですが、数値のみのカラムにアルファベットが混じってしまうと、テキストも混在してしまいます。
じゃあ、全部テキストとして判定してほしいって思わない?
そうはならないんだな。これが…

具体例を上げますね。
以下のようなデータをロードしてみます。100, 200…のような数値データで始まり、途中で10AとかZZZのようなアルファベット交じりのデータが入ってくる…
前職でも経験したんですが、こういうデータってビジネス上よくあるんですよね。

Load * Inline [
code
100
200
300
400
500
10A
20A
ZZZ
];

データ型が混在したデータのソート順はどうなる?

上記で作成したデータをロードして、ソート順を見てみます。
あれれ、10Aが先頭に来てしまいました。
一般的なソート順は、100, 10A, 200, 20A, 300…,ZZZじゃないですかね?
これじゃあ、お客様も「何とかしたい!」って思って当たり前

テキスト変換してみる

text関数を使って、強制的にテキストに変換してロードしてみます。

Load text(code) as code 
Inline [
code
100
200
300
400
500
10A
20A
ZZZ
];

リロード実行すると、こんな結果になりました。
できていそうな気がしますが…
惜しいっ!
ZZZは最後になりましたが、10A, 20Aが先にきちゃいました。
むむむ…
どうしたものか

Dual関数とMapSubstringの合せ技で解決!

その解決方法とは…
数値もテキストも強制的にソートする文字列に変換すればいい
ってことなんです。
Mapping Loadを使用して、ソート順に使える文字列に変換するようにします。

MapChr:
Mapping
Load * Inline [
before,after
0,00
1,01
2,02
3,03
4,04
5,05
6,06
7,07
8,08
9,09
A,10
B,11
C,12
D,13
E,14
F,15
G,16
H,17
I,18
J,19
K,20
L,21
M,22
N,23
O,24
P,25
Q,26
R,27
S,28
T,29
U,30
V,31
W,32
X,33
Y,34
Z,35
];

データをロードする時に、MapSubstringを使用して、MapChrテーブルを呼び出し、ソート文字列に変換します。
そしてDual関数を使用して、見た目の値と内部値を持つように設定してあげます。

Load Dual(code,MapSubString('MapChr',code)) as code 
Inline [
code
100
200
300
400
500
10A
20A
ZZZ
];

結果は以下のとおり!
想定した結果になりました。
表示はテキストのように見えますが、内部値は数値なので、表示は左寄せにするなど調整して下さいね。

まとめ

数値とテキストが混在したデータのソート順問題を解決する小ワザをご紹介しました。
「なあーんだ!」って感じですよね。
以上、頭の体操でした。

この記事が参考になったという方は、下のボタンからフォロー是非お願いします。
ではまた!

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

この記事を書いた人

目次