Tableau で Calendar その 3 (全部で3か4)

まだ続きます。

月ごとのカレンダーは出来ましたので、年間カレンダーに移ります。

ここでちょっとだけハードルが上がります。

まず、「月」を縦横に並べるため、縦と横のソートID を付与します。

 

並び方は、4月が左上、次に右に進んで6月が右上、7月が2段目の左端、 3月が 右下 ということにします。

ですので、縦と横のIDをつけるとすれば、下記の様になりますね。

f:id:skn_0410:20160707081752p:plain

 

IF で対応することも出来ますが、あまりかしこくありません。標準で使える計算式を考えます。

 

月の配置 : 縦のID

3で割って、切り上げでいけそうです。

[Month ID V 1]
int([Normal month]/3)

f:id:skn_0410:20160707075433p:plain

こうなりました。一個ずれてます。最初にひとつずらします。

[Month ID V 1]
int ( ([Normal month]-1)/3)

f:id:skn_0410:20160707075606p:plain

0から始まるのは気持ち悪いので、1 を足しなおします。  

[Month ID V 1]
int ( ( [Normal month]-1)/3)+1

 OKです。(ちなみに、四半期のIDとしてそのまま使えます)

 

月の配置 : 横のID

「1,2,3」「,1,2,3」 のループです。直感として、3で割った余りですね。

Tableau では、「%」がそれにあたります。エクセルの「Mod」ですが、式がちょっと変わります。

[Month ID H 1 ]
[Normal month]%3

f:id:skn_0410:20160707080124p:plain

いい感じなのですが、「1,2,3」の代わりに「1,2,0」になってます。

ここで「1」を足したらダメですよ。それだと、「2,3,1」になるだけです。

さっきと同じ、1 から始めるのではなく、0から始めます。

[Month ID H 1 ]
( [Normal month]-1)%3

f:id:skn_0410:20160707080727p:plain

もうちょいです。「1」を足して「0」を回避します。

[Month ID H 1 ]
( ( [Normal month]-1)%3)+1

f:id:skn_0410:20160707081925p:plain 

できました!

 

さて、この12個の月の枠の中に、日付を入れていきます。

横は、曜日なのでOK だとして、縦が問題です。

一旦、そのまま配置してみます。

(1~53 の週のID を使用します)

横に曜日のID、縦に週のID 、Label に 日付です。

 

f:id:skn_0410:20160707222748p:plain

あたりまえですが、ずれちゃいます。ここからはヒント得られないですね。。。

仕方ないので、ロジックだけで考えてみましょう。

  • 年間を通じた 週ID は使えません。月ごとに1~最大6を付与する必要があります。
  • 週が変わるのは、月曜日です。

何が出来るでしょうか。。。

 

週の配置:縦のID

 

まず、前回のdatetruncを使って、直前の月曜日を出します。

[Monday Before]
datetrunc('week',[Calendar Date],'Monday')

この新しい日付を使えば、同じ週であれば同じIDが 得られます。次は、1~6までの算出の仕方を考えます。

すでに、全ての日付を月曜日に固定できているので、月曜日だけを考えます。

つまり、ある月曜日から、その月の最初の月曜日を引けば「7」の倍数で日数が出ます。それを「7」で割ってあげればいい訳です。

 

でも待って!!

月の最初の月曜日。。。???

 

1/1 が水曜日のときは、直前の月曜日って12/30 になってしまいます。そのまま配置すると、。。。めちゃめちゃになります。

 

月の最初が月曜日であれば、その月の最初の月曜は「1」、月の最初が火曜日~日曜であれば最初の月曜日は週ID が「2」です。。。。。

IF は使いませんよっ!! こんなことくらいでは!

 

うーん。発想の転換が必要です。

 

ちょっとトイレ行ってきました。

 

さて、気を取り直して再開。

 

週の配置:縦のID (再挑戦)

第1週に絶対に存在する曜日。それは月曜日ではありませんでした。

月曜スタートのカレンダーで、どんな組み合わせの月でも、絶対に第1週に存在する曜日は、

そう「日曜日」なのです。

ここからの日付を「7」で割ってあげればよいのです!!。1/1 が月曜日なら、「1」。ずっ~とすすんで1/1が土曜日なら「6」。そして、1/1 が日曜なら「7」!!!

がしかし、また考えます。

第1週の土曜日までは、「月の最初の日曜日」を引き算したらマイナスになってしまいます。  orz

え~っと。。

ようやく気づきました。

必要なのは、直前の日曜ではなく、「直後の日曜日」だったのです。


実際の算式はこうです。

[Next Sunday]
date({fixed [Noramal year],[Normal month]:
Min(datetrunc('week',[Calendar Date]+6,'Sunday'))})
[Weekday ID 4]
int((([Calendar Date]+6-[Next Sunday]))/7)+1

さて、表に配置!

 

f:id:skn_0410:20160707222519p:plain

 

できたっぽい! 長くなったので、今日はここまで。次回、最後のFormat やりたいと思います。

それでは、ご自分でトライして、楽しんでください。