表示とカウントの条件が複数ある場合のビジュアルの作成の仕方を教えてください。

以下のようなデータセットから、利用者が希望する形のビジュアルを作成したいと思っています。

【データセット】

【ビジュアル】

どのようにして実現をしたらよいか、アドバイスを頂きたいです。
よろしくお願い致します。

@optarc.yamaji

ご質問ありがとうございます。
本件については計算フィールドを利用する形で実現が可能です。

イメージ

  • SUMOVER 表 → 今回実現するテーブル
  • ALL_ROWS 表 → 確認用全件テーブル

ステップ
1. データセットにて no_order の n 週目を除く合計値を事前計算
データ準備画面の計算フィールドにて以下の計算式でフィールドを作成します。
・フィールド名:c_Sumover_no_order_notNweek
・フィールド式:
sumOver(ifelse(week=${WEEKS},0,ifelse(isNotNull(no_order),1,0)),[user ASC],PRE_FILTER)

フィールド式説明(内側から):
(1) 各行の no_order 項目を数値変換 (〇→1、NULL→0)
(2) 特定週の場合に除外(柔軟性のためパラメタを使用していますが固有値でもOK)
(3) 1.2.の値を user 単位にビジュアル表示/フィルタ"前"に集計(PRE_FILTERオプション)

計算順を意識した計算のことを QuickSight では LAC(※) と呼んでいます。(※) Level Aware Calculation
今回のように、ビジュアルで動的に変更したくない値などを作成する際に使用できます。
(ご参考: Amazon QuickSight でのレベルアウェア計算の使用)

2. ビジュアルを作成
通常通りビジュアルを作成します。
パラメタを使用した場合は、6Wなど指定したい週によってフィルタをかけます。

上記、ご確認頂けますと幸いです。

2 Likes

ありがとうございます!

無事表示させたい形にすることができました!

LACやsumOverなどの関数は、理解しきれておらず、関数の説明もわかりやすくて助かりました。

以前、教えていただいた計算でやりたいことの実現はできたのですが、データの状態によって思った通りに計算ができなくなりました。
データとしては以下添付のようになっており、全週が1itemのときは想定どおりに動くのですが、途中で2itemや3itemが含まれると、最終結果のcountを5にしたいのに、10になってしまいます。
解決する方法はありませんでしょうか?

その週にno_orderがあるかを判定し、その週の数をカウントしたいのであれば、次のような計算フィールドはどうでしょうか。

had_noOrder_weekly

ifelse(sum(ifelse(week=${week}, 0, {no_order_int}), [user, week])>0, 1, 0)

no_order_int

ifelse({no_order}="",0,1)

weekパラメータを利用していますが、この値は固定値でも問題ありません。
集計単位に [user, week] を利用することで user-week 単位のグループ化を行い、そのグループ内のno_orderの数が1以上であれば1を返すようにしています。

ただしこの計算フィールドは集計関数のため、6週のデータと組み合わせて表示することはできません。

1 Like

無理やりテーブルに表示できる形式で表現するなら、user単位で合計を取ったときに値が一致するように行数で割る実装もありますが、見栄えは良くないですね。(カラム名は適当です)

ご教授頂きありがとうございます!

ご質問している一番最初でお伝えしている通り、ビジュアルで表示する際に、6週目の実績対して値を計算しなければならないため、事前フィルターがかかってしまい、教えていただいた計算式では集計が0になってしまいました。

どのように解決したらよろしいでしょうか?

一つ上の投稿のビジュアルに6週のみを表示するフィルターを掛けるとこのようになります。合っていそうですがどうでしょうか?
テーブルのデータはグループ化の条件を使わず値に配置しています。

追加した計算フィールド4つの詳細です。
no_order_int

ifelse({no_order}="",0,1)

c_Sumover_no_order_notNweek

sumOver(ifelse(week="6週",0,ifelse({no_order}<>"",1,0)),[user, week],PRE_FILTER)

d

ifelse({c_Sumover_no_order_notNweek}>0,1,0)/ifelse({c_Sumover_no_order_notNweek}=0,1,{c_Sumover_no_order_notNweek})

6週を除くno_orderの回数

sumOver(d,[user],PRE_FILTER)

1 Like

ありがとうございます!
教えていただいた方法で計算をさせたところ、やりたい形に計算ができました。

複数計算が出てきてなんとなくしか理解が進んでおりませんので、よろしければ解説をしていただけると嬉しいです。

どうぞよろしくお願い致します。

最終的にやりたいことはユーザー毎にno_orderが1個以上ある週の和を求めることです。
ただし、集計せずにテーブルに値を表示する必要があるため面倒な計算を行っています。

まず c_Sumover_no_order_notNweek では ユーザー・週単位のno_orderの個数を求めています。

あとは ユーザー・週単位 でその値が1以上のものの数を求めればよいのですが、テーブルに値を表示する制約のためにそのまま合計を求めるとc_Sumover_no_order_notNweek の値を複数回カウントしてしまいます。(例えばUser Aの4週目には項目が3個、no_orderが3個あるため、直接和を求めると3x3=9個カウントされてしまう)

そこで和を取ったときに週ごとの合計が0/1になるように値を調節するために d フィールドを作成しています。

1 Like

こちらの計算で正しく通常は計算できていたのですが、計算がうまくいかないときが出てきました。
状況としては、以前提示したデータイメージでお伝えした通り、複数itemに該当する週が今週だった場合に集計の数字が5ではなく8とか10になってしまいます。
自分でも考えてみたのですが、うまくいかずで、解決策をご教授いただいたいです。