Qlik Community

Japan

Announcements
Read about the latest Qlik Community enhancements on the Community News blog!
cancel
Showing results for 
Search instead for 
Did you mean: 
marreon
Contributor
Contributor

SET分析

If(ValueList('中国','韓国','台湾') = '中国',
Avg({$<[住所]={$(中国)}>} aggr(age(min([来日日付]),[生年月日]),[個人コード])),

If(ValueList('中国','韓国','台湾') = '韓国',
Avg({$<[住所]={$(韓国)}>} aggr(age(min([来日日付]),[生年月日]),[個人コード])),

Avg({$<[住所]={$(韓国)}>} aggr(age(min([来日日付]),[生年月日]),[個人コード]))))

 

上記内容でメジャーを作成し、軸にはValueList('中国','韓国','台湾')を作成し、ある人の初来日日の年齢を国別に見たいと思っています。

この時、なぜか中国のみしか値が反映されません、

なぜでしょうか。

なお、中国、韓国、台湾の識別に住所に特定の文字が入る場合、それぞれに振り分けるような関数を組んでいます。

 

よろしくお願いいたします。

9 Replies
yuz
Employee
Employee

残念ながらこれだけではよくわからないです。$(中国)、$(韓国)は変数でしょうか?中国のみしか値が反映されないというのは、中国欄の計算は正しく、他は表示されないということでしょうか?最終行は$(台湾)でしょうか?

if文のネスト自体は正しそうなので、変数の設定に問題があるのかもしれません。

例えば、3か所のSET数式をすべて{$<[住所]={$(中国)}>} として、韓国欄も台湾欄も中国の値がでる。または、すべて{$<[住所]={$(韓国)}>} とすると中国欄も何もでなくなる、といった状況なら$(韓国)が正しくないと考えられます。

marreon
Contributor
Contributor
Author

ご返信ありがとうございます。

おっしゃる通り、$(中国)、$(韓国)は変数です。

最終行は台湾です。失礼いたしました。

変数の設定ですが、中国は「"*china*"」、韓国は「"*korea*"」としています。

なお、valuelistの順番を変更し、ValueList('韓国','中国','台湾')とした場合(メジャーも同様)、

韓国の数値が表示され、今度は中国の数値は表示されなくなってしまいます。

(つまり、先頭行のみちゃんと計算される状態です)

そのため、変数の問題とは考えづらく、その他何か問題点はありますでしょうか。。。

yuz
Employee
Employee

大変失礼しました。どうもValuelistとAggrの組合せは正しく計算されない限界があるようです。

https://community.qlik.com/t5/QlikView-App-Dev/ValueList-and-aggr/td-p/1224863

https://community.qlik.com/t5/New-to-Qlik-Sense/Aggr-Expressions-NOT-Working-when-using-ValueList-to...

上記の記事からたどったブログに、Nodistinct を使用するとうまくいく場合もあるが必ずとは言えないとありますので、今回の場合は、あらかじめ初来日の年齢をスクリプトで計算しておくなどでご対応いただくのが良いと思います。

marreon
Contributor
Contributor
Author

ありがとうございます。

別途項目に「来訪都道府県」というものがあるのですが、

「来訪都道府県」ごとに、初来日年齢(つまり都道府県ごとに初めて訪れた年齢)を

あらかじめスクリプト内で計算する場合、

どのようなスクリプトを組めばよいのでしょうか。

yuz
Employee
Employee

全体のデータ構造とアプリの仕様がわからないのですが、1つのデータに訪問日付と生年月日を持たせてしまえば計算できます。仮に、個人コード、都道府県、訪問日付を持つデータAと、個人コード、生年月日を持つデータBがあるとします。

1.スクリプトでデータAにデータBをLeft Join します。
データAは、個人コード、都道府県、訪問日付、生年月日となります。
2. 再度データAをロードしながら、Age関数を使って、訪問日付と生年月日から訪問時点の年齢を求めます。

marreon
Contributor
Contributor
Author

ありがとうございます。

たとえば下記のようなデータをロードし、

ーー

個人コード  都道府県  訪問日付  生年月日  訪問年齢
1        東京/千葉     2019/1/1   1990/4/15  29
2        北海道    2020/2/1   1995/12/15   24
3        東京     2018/8/1   2000/7/15      18
1        沖縄     2021/3/1   1990/4/15      31
2        北海道    2021/3/1   1995/12/15    25
3        北海道    2021/4/1   2000/7/15      21
4        沖縄     2021/5/1   2012/8/5         9

ーー

最終以下のようなデータを算出したい場合、

ーー

都道府県  初訪問年齢平均
東京    23
千葉    29
北海道   22
沖縄    20

ーー

どのように関数を組めばよいのでしょう・・・?

こちらで非常に手こずっておりまして。。。

説明不足で申し訳ございません。

何卒宜しくお願い致します。

yuz
Employee
Employee

遅くなってしまいました。

1行目はデータ1件に2つの都道府県があり、このままでは計算に使えません。このように1件に複数の値がある場合にデータをその値の数だけ分ける必要があります。さらに分けたデータが初回訪問か2回目以降かの印をつける必要があります。そのようなデータを作るロードスクリプトを(師匠が)作成しました。添付をご覧ください。

データができたあとは、画面で都道府県を軸にして、初回訪問の印が付いているデータの訪問年齢の平均を計算します。avg({<初訪問 = {1}>}[訪問年齢])

ご参考になさってください。

marreon
Contributor
Contributor
Author

ありがとうございます!

大変参考になりました。

私でもスクリプトおよび数式を組んでみたのですが、

以下内容だと正しく集計されない可能性はありますでしょうか?

ーーー

【スクリプト】

[一時データ]:
LOAD [個人コード],
[都道府県],
[訪問日付],
[生年月日]
FROM [lib://Community/訪問データ.xlsx]
(ooxml, embedded labels, table is Sheet1)


[二次データ]:
Load *,
Age([訪問日付],[生年月日]) as [訪問日年齢],
Resident [一時データ];

Drop Table 一時データ;


[初訪問日データ]:
Left Join([二次データ])
Load [個人コード],
[都道府県],
date(Min([訪問日付])) as 初訪問日
Resident [二次データ]
Group By [個人コード],[都道府県];


[診療データ]:
Load *,
Age([初訪問日],[生年月日]) as [初訪問年齢],
Resident [二次データ];

Drop Table 二次データ;

 

【シート上の計算(ピボットのメジャー)】

If(ValueList('東京','北海道','沖縄') = '東京',
Avg({$<[都道府県]={$(東京)},[個人コード]={"=min(訪問日付)"}>}[初訪問年齢]),
If(ValueList('東京','北海道','沖縄') = '北海道',
Avg({$<[都道府県]={$(北海道)},[個人コード]={"=min(訪問日付)"}>}[初訪問年齢]),
If(ValueList('東京','北海道','沖縄') = '沖縄',
Avg({$<[都道府県]={$(沖縄)},[個人コード]={"=min(訪問日付)"}>}[初訪問年齢]),0)))

ーーー

なお、都道府県欄は、「/」のみで区切られるわけではなく、

場合によっては「・」や「、」など様々なため、

valuelistを使っています。

また、変数については、「$(東京)」は「"*東京*"」などとしております。

 

よろしくお願いいたします。

yuz
Employee
Employee

テストを実施して疑問点がでましたら、また別途ご質問ください。よろしくお願いします。