#WorkoutWednesday 2020/W26 の課題で会計年度(Fiscal Year: 以降FYと記載)が出てきたのですが、その際に計算フィールドでFYを指定、操作できないかと思い試行錯誤した内容をここにまとめます(比較的軽い内容です)。
今回の目標は、下記のようなFY(での累計数値、YoY(前年同日比)に関するダッシュボードを作成することです(使用データはSample Super Store)。
今回使用したWorkbookはこちらからダウンロードできます。
注:今回の計算は「会計月度(Fiscal Month: 以降FMと記載)は1日始まり」であることを想定しています。
そうでない場合、素直にカレンダーテーブルを作成し結合して計算を組み立てることを推奨します。
はじめに:Tableauの会計年度について
まず、FYに関するTableauヘルプページを参照します。
要はデータソースなり日付型ディメンションの日付プロパティを設定しましょう、ということなのですが、ここで重要な記述があります。
注: 日付関数は、構成された会計年度の開始を考慮しません。日付関数を参照してください。
そう、上記の方法で設定されたFYは、計算フィールド内で反映されません。この問題を少し見てみます。
以下では10月スタートのFY 2017とFY 2018を表示しています。
ここで、FY2018だけ抜き出したいとして、以下の計算式をフィルターに使います。
YEAR([Order Date]) = 2018
さて、この計算式がTRUEを返すのは上記表ではどこでしょうか。
答えはを言うと、FYではなくカレンダー年月を参照するので、カレンダー日付で2018年のものがTRUEになります(下図中オレンジがTRUE)。
一方で、特定FYの情報のみを取り出したい場合、どう考えても計算フィールド内でFYを扱う必要があります。
Tableauの機能上の問題で諦めるのは良くないので、FYもTableauの基本機能ではなく計算フィールドで制御してしまおう、というのが今回のモチベーションです。
ということで、計算を見ていきましょう。
FY制御をする計算フィールドをつくる
計算に入る前に、「基準日より後のデータが手元にない」状態としたいので、以下の計算式をデータソースフィルターに設定します。
Filter: Up to Basis Date
[Basis Date] >= [Order Date]
ここでBasis Dateは日付型のパラメータで、レポートを見る日付を想定しています。
さてFYに関する計算ですが、最初に現FYの開始月を取得する計算フィールドを作成します。
1-1.Latest Starting FM
DATE(DATETRUNC(
'month'
,{MAX(
IF MONTH([Order Date]) = [FY Starts from]
THEN [Order Date]
END)}
))
ここでFY Starts fromは整数型パラメータで、何月からFYが開始するかを取得します。
計算式の内容を説明すると、IF文を使用したLOD計算で「FY開始月の同じ月のOrder Dateから最大のものを取得」することにより、現FYの開始月の中の最大日付が取得できます。
これをDATETRUNCで月に丸め込むので、この計算式は上記開始月の1日を返します。
さて、この現FY開始月を元にして以下の計算を作成します。
2-1. Current FY
DATEDIFF('month',[1-1.Latest Starting FM],[Order Date]) >= 0
今回はFilter: Up to Basis Dateを使用してBasis Date以降のデータが入っていないため、現FY開始月以降の日付を持ってくれば、現FYのデータ全てが取得できます。
同様にして、前FYの情報も取得できるようにします。
1-2. Previous Starting FM
DATE(DATEADD('year',-1,[1-1.Latest Starting FM]))
2-2. Previous FY
DATEDIFF('month',[1-1.Latest Starting FM],[Order Date]) < 0
AND DATEDIFF('month',[1-1.Latest Starting FM],[Order Date]) >= -12
実際に色付けして見てみると以下のような形です。
青色が2-2. Previous FYによるもの、オレンジ色が2-1. Current FYによるものです。
ということで、これで会計年度でも日付計算が使えるようになりました。
実際に現FYと前FYのSalesを出してみましょう。
1-1. Current FYtD Sales
IF [2-1. Current FY] THEN [Sales] END
1-2. Previous FY Sales
IF [2-2. Previous FY] THEN [Sales] END
簡単なBullet Graphを出してみます。
さて、FYは10月スタートと想定すると、グラフも10月から始まっていて欲しいです。
この表示自体は最初に言及したTableauの会計年度の基本設定で実は何とかなるのですが、ここでは(配布用に汎用性が欲しかったので)ソート用の計算フィールドを作成します。
1-3. Next Starting FM
DATE(DATEADD('year',1,[1-1.Latest Starting FM]))
3. Month Label
ABS((DATEDIFF('month',[1-3. Next Starting FM],[Order Date]) + 1) % 12)
Next Starting FMは単に次のFYの開始月です。
Month Labelについて、こちらは中身を見て頂いた方が分かりやすいです。
要はFYにおけるFMについて、連番で数字をつけるための式です。
これを先ほどのグラフの月の並び替えに使用します。
その他のダッシュボードの各グラフについては上記までの内容の組み合わせのため割愛しますが、要は日付計算の組み合わせから会計年度を自在に操れます、という話でした。
最後に
会計年度を日付計算から作成しようの回、いかがでしたか。
応用性が高そうな計算式のため、ぜひ作って遊んでみてください。
ご質問等はTwitter、Linkedinへよろしくお願いします。それでは。