Countover関数を用いた集計について

前回ご質問させていただいてはいたのですが、実データでうまく集計することが出来ずもう一度お助けいただけたら幸いです。

元データ、やりたい集計(オレンジ枠)、現状(青枠)は下記画像の通りになっております。
期間内合計作業件数は作業者ごとのすべての作業の合計件数となっており、フィルタで絞った期間の作業a,b,cの合計値を表示させたいです。

前回ご質問させていただき
期間内合計作業件数=max(countOver(作業,[作業者,日付],PRE_FILTER))
の関数を作成いたしました。
しかし現状すべて1となってしまいうまく集計することが出来ません。

度重なる質問で大変恐縮ではございますがお力添えいただけると幸いですよろしくお願いします。

@ytkd さん、ご質問ありがとうございます。
前回のお問い合わせとはフィールドの項目や計算条件が異なるところがあるようにお見受けするため、前回までの文脈は一旦切り離し、今回頂いた条件を前提にお答えします。

頂いた画面ショットを整理すると、以下の順序で計算を行う必要があると理解しました。

①「日付」フィールドに対するフィルターを適用

②「作業件数」を作業者単位で合計

③「作業」フィールドに対するフィルターを適用 ※②の計算結果はそのまま表示範囲だけ絞り込み

まず、①については特別なことは無く「日付」フィールドに対するフィルターを作成ください。以下の例では、開始日付としてstartDate、終了日付としてendDateのパラメータを作成し、パラメータをフィルター内で利用しています。

次に②ですが、「期間内合計作業件数」は以下の計算式になります。
①のフィルター適用後かつ③の処理前のタイミングで計算を行うため、PRE_FILTERではなくPRE_AGGとなります。そして、合計のためcountOverではなくsumOverを利用します。

期間内合計作業件数

sumOver(作業件数, [作業者], PRE_AGG)

最後に③ですが、データセット内にある「作業」フィールドに対してフィルターを適用すると①と同じタイミングでフィルターが適用されてしまうため、少し工夫をする必要があります。具体的には、フィルター対象として使うための専用の計算フィールド「作業_フィルター用」を以下の計算式で作成します。

作業_フィルター用

firstValue(
    作業,
    [作業者 ASC],
    [作業者,日付,作業]
)

そしてこの「作業_フィルター用」フィールドに対し、フィルターを設定します。以下の例では、データセット内の「作業」フィールドに紐づくtaskと言うパラメータコントロールを作成し、フィルター内で利用しています。

少し補足すると、firstValueはテーブル関数の一種であり、QuickSightの計算順序(ご参考)の最後のステージであるビジュアル集計レベルで計算が行われます。このfirstValue関数を使った計算フィールドをフィルター対象とすることで、③のフィルター処理を一番最後に持ってきています。firstValue関数の計算内容自体にはあまり意味は無く、ご覧いただけるように元の「作業」フィールドと同じ値を返すような計算式としています。

なお、上記画面ショットでは説明のためテーブル内に「作業_フィルター用」を表示しています、以下のようにフィールドウェルから外していただいても大丈夫です。最終的にご要望の計算になっているかと思いますが、念のためお手元のデータでも同様になるかご確認をお願いいたします。

2 Likes

@ytakahr さま
前回に引き続きご回答ありがとうございます。
実データをお見せすることが出来ず、質問用としてデータを作り説明させていただく中で前回と今回で内容が異なってしまい申し訳ございません。

記載いただいた①~③のやり方を試したところ実際のデータでもやりたいことを実現することができました。

自力で解決ずることが出来す、困っていたため非常に助かりました。この度はご回答頂き誠にありがとうございました。

1 Like