Tableau で Calendar その 3 (全部で3か4)
まだ続きます。
月ごとのカレンダーは出来ましたので、年間カレンダーに移ります。
ここでちょっとだけハードルが上がります。
まず、「月」を縦横に並べるため、縦と横のソートID を付与します。
並び方は、4月が左上、次に右に進んで6月が右上、7月が2段目の左端、 3月が 右下 ということにします。
ですので、縦と横のIDをつけるとすれば、下記の様になりますね。
IF で対応することも出来ますが、あまりかしこくありません。標準で使える計算式を考えます。
月の配置 : 縦のID
3で割って、切り上げでいけそうです。
[Month ID V 1]
int([Normal month]/3)
こうなりました。一個ずれてます。最初にひとつずらします。
[Month ID V 1]
int ( ([Normal month]-1)/3)
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
いい感じなのですが、「1,2,3」の代わりに「1,2,0」になってます。
ここで「1」を足したらダメですよ。それだと、「2,3,1」になるだけです。
さっきと同じ、1 から始めるのではなく、0から始めます。
[Month ID H 1 ]
( [Normal month]-1)%3
もうちょいです。「1」を足して「0」を回避します。
[Month ID H 1 ]
( ( [Normal month]-1)%3)+1
できました!
さて、この12個の月の枠の中に、日付を入れていきます。
横は、曜日なのでOK だとして、縦が問題です。
一旦、そのまま配置してみます。
(1~53 の週のID を使用します)
横に曜日のID、縦に週のID 、Label に 日付です。
あたりまえですが、ずれちゃいます。ここからはヒント得られないですね。。。
仕方ないので、ロジックだけで考えてみましょう。
- 年間を通じた 週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
さて、表に配置!
できたっぽい! 長くなったので、今日はここまで。次回、最後のFormat やりたいと思います。
それでは、ご自分でトライして、楽しんでください。