月間累計の営業日を表示させたい

フィルターで営業日を指定した際、その指定した日が月間累計の何営業日に該当するか表示したいのですが、どのように計算させたらいいかご相談したいです。

データセットでは
営業日、店、商品、売上などを保持しています。

月の起点日が21日〜なので、21日〜数えて何営業日目かを数える必要があります。
土曜日、日曜日はお休みなので、月〜金曜日の数となります。
例えば2024/11/26でフィルターをかけた場合、4と表示されるようにしたいです。

当初dateDiffを利用して計算をさせようとしたのですが、営業日のみにすることができずうまく計算ができませんでした。

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

ご質問ありがとうございます。
netWorkDays関数を使うと、二つの日付の間の土日を除く営業日数を計算することができます。
この機能を使い、以下のような計算フィールドを作ると毎月21日を起算日にした累計の営業日数が表示できると思いますが、こちらでご期待に沿いそうでしょうか?

ifelse(
    dateDiff(truncDate('MM', 営業日), 営業日) >= 20,
    netWorkDays(addDateTime(20, 'DD', truncDate('MM', 営業日)),営業日),
    netWorkDays(addDateTime(20, 'DD', truncDate('MM', addDateTime(-1, 'MM', 営業日))),営業日)
)

1 Like

ありがとうございます。
いただいた関数で対応をしてみましたが新たな課題が見つかりました。

土日以外のカウントでよいと思っていたが、イレギュラーも多々あり客数が集計されている日のカウントをしなければならないことがわかりました。

その場合はどのような関数で実装できそうでしょうか。

ご確認ありがとうございます。
土日でも売上のある日があり、そのような日は累計の営業日日数にカウントしたい、と理解しましたが合っていますでしょうか?
(例. 11/23は土曜のため本来は営業日外だが、この日に売り上げがあるため累計営業日数にカウントしたい。)

ご認識のとおりです。
逆に土日以外でも休業することがあり、その日はカウントを除外する必要があります。

@optarc.yamaji

イレギュラーがあると、netWorkDays()は使えないですね。
客数データは別途そのようなフィールドがあるという想定で考えてみましたが、計算フィールドで実現するのは難しいですね。

@optarc.yamaji

以下のように複数の計算フィールドを組み合わせると、曜日に関わらず、毎月21日を起算日しながら売上の上がった日(=レコードのある日)を営業日として累計することができました。

月度
ifelse(
    dateDiff(truncDate('MM', 営業日), 営業日) >= 20,
    extract('MM', 営業日),
    extract('MM', addDateTime(-1, 'MM', 営業日))
)
日にち
extract("DD", 営業日)
加算営業日
ifelse(
    max(日にち) = 21,
    0,
    difference(max(日にち), [営業日 ASC], -1) > 0,
    1,
    0
)
累計営業日数
runningSum(加算営業日,[営業日 ASC],[月度]) +1
イメージ

なお、累計営業日数はrunningSumを使って計算していますが、runningSumはフィルター適用後に計算されるため、特定日付でフィルターをした場合には、以下のようにフィルター後のデータの範囲内で累計されてしまう点にご注意ください。

そのため、当初ご要望いただいていた

フィルターで営業日を指定した際、その指定した日が月間累計の何営業日に該当するか表示したい

という挙動が求められる場合には、現状QuickSight内に完結して実現することは難しそうなため、上記の計算フィールドと同様の前処理を上流のデータソース側で行うこともご検討いただければと思います。

2 Likes

@ytakahr @Wakana

ご検討いただきありがとうございます。
フィルターの利用が必須のため、やりたい形を計算フィールドで実現するのは難しいとのこと承知致しました。
データセット側でなにかできないか検討してみます。
ありがとうございました。

1 Like

@ytakahr @Wakana

フィルターが必須ということで諦めていましたが、以前「periodOverPeriodLastValueでビジュアルだけフィルターする方法」について教えていただいたのを思い出し、対応してみたところ、runningSumを利用してやりたいことができました!

ビジュアルフィルター用の営業日

minOver(min(営業日), [営業日])

上記を追加しフィルターを行い、ビジュアルだけフィルターされrunningSumが想定どおりに計算をしてくれました。

また、実際のデータでは店舗別で、客数がある日を加算したかったため

加算営業日

ifelse(
    max({日にち}) = 21, 0,
    ifelse(isNull(avg({客数})), 0,
    difference(max({日にち}), [営業日 ASC], -1,[店舗]) > 0, 1,
    0
))

に変更して対応を行いました。
ありがとうございました。

2 Likes

@optarc.yamaji
ご連絡ありがとうございます。最終的にご要望通りのことが実現できたとのことで何よりです。集計後のフィルター適用のテクニックについても参考になりました。

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

1 Like

@optarc.yamaji

すばらしいです!そうですね、確かに、minOverでフィルターすることで対応できますね!ソリューションを提供いただき、ありがとうございます!

1 Like