エクセルなら簡単なのに・・・ちょっとややこしい入出庫管理
先日、こんな肩書きを頂戴しました。
もちろん、嬉しいのは嬉しいのですが、周りの人達の知識・スキルがものすごいので、ちょっとついてけるかどうか不安です。
下手な解法書いて、別のアンバサダーの人あるいは一般のメンバーから「それは違うと思いま~す」とかダメ出しされるとヘコみそうです。でも頑張ります。
今回は、私が最初にコミュニティで答えを教えてもらった案件を再現します。
初期のころは、何も知らずに一人でハマりまくっていました。何時間かけたことでしょう。。。『タブローって、案外使えんなぁ。結局エクセル頼みかよ~』とか思ってたのですが、使えないのは自分だった訳ですね。
その案件というのは、以下のようなものです。
データ例
日付とSupply、Orderがありまして、計算したいのは、SupplyからOrderを差し引いた残り在庫。
ただし、当たり前ですが、Orderの方が、在庫を上回ってしまうと出庫できないので、そのときはマイナスでなく、「0」を計上する必要があります。
- エクセルだと、どうしたか
エクセルでグラフを書くとこんな感じです。
グレーの棒グラフが、その月単月のプラマイを示していて、青色が、単純な累計。
黄色が、望まれる計算を織り込んだ在庫となります。具体的な計算式は、下記のようになりますね。
タブローの話の前に、エクセルの計算式を、「=IF(F2+B3-C3>0,F2+B3-C3,0)」このようにしている方は、時間を大きく損してますからね!!
IF は面倒くさいので避けてください。0以上とか0以下とかで判定が必要な場合は、Max、Minを使いましょうね。
- タブローだと、どうするか
さて、
最初にトライしたのは、running_sum です。Table Calculationから計算式を起こせるので、それをコピーして借りてきて、0 以下を0にしました。
こうです。
まず、Supply-Orderを計算させた上で、
[Supply - Order]
[Supply]-[Order]
累計が、マイナスの時に、0 を返すようにしました。
[Cum_total (Exclude Negative) Trial]
max(0, running_sum(sum([Supply - Order]) ))
これだとうまくいきません。
こうなります(紫)。
一瞬、できたかと思うんですけど、普通の累計(茶色)の、マイナス部分が「0」に置き換わっただけです。
過去の Order をさかのぼって満たすことはできないため、実現したいのは下の赤のラインです。
再度、エクセルの計算式を見てみると、
計算に、3つのセルを使用しています。ここで、B3とC3は、タブローで参照するのは簡単です。
問題は、F2 です。
タブローの「lookup」 も 思いつきますが、前の値を参照したいのは、入力しようとしているField そのものなので、うまくいきません。
エクセルは、セルそのものを参照できるので、必要に応じて、あっちこっちのセルが参照でき、汎用性が非常に高いです。
対してタブローは、グラフ作りに特化しているため、「セル」という考え方はなく、あくまでFieldどうしの関係性で新たな数値を計算します。「計算」そのものは、はっきり言うと、超苦手です。(その代わり、グラフ性能はエクセル、メじゃないから!!)
それを補うために、Table CalculationやLODなどの関数が備えられており、ちょっと覚えて使いこなせるようになれば、かなりの要求は満たせるようになります。
とは言うものの、(これはエクセルでも同じですが)技を「知っている」か「知っていないか」で同じ仕事を完了するのにかかる時間が、「2秒」と「2日」 とかの差になってしまうのも事実です。
ということで、そういう困った時は、コミュニティーを使います。
Yahoo 知恵袋に エクセルの質問するみたいな感じで、タブローコミュニティに質問すれば、無料、早い、丁寧 で答えが返ってきます。
私がPost したときのやり取りが下のリンクになりますが、それでもそのときは時間がかかりました。でも、何人もが親切に考えてくれて、最終的には答えに辿り着き、このコミュニティ、すげえ となった訳です。
Question regarding running total |Tableau Support Community
ちなみに日本語での質問は、Japan の コミュニティで 運用されてます。
Group: Japan |Tableau Support Community
でもグローバルサイトに日本語で質問しても、別に問題はありません。
なんか取りとめもなく、長くなってきたので、答えを。。
使うのは、たぶん使用頻度がめっちゃ少ない関数である、「previous_value」です。
この関数は、入力しているFieldそのもののテーブル内での位置を判定し、その field自身の前や後ろの数値を参照できるものです。普段はあまり使いませんが、今回のように、結果次第で判定が必要な場合には、この関数が必要です。
[Cum_total (Exclude Negative)]
max(0,(previous_value(1)+ sum([Supply]) - sum([Order])))
previous_value(1)は同じFieldのひとつ前の数字です。
結果的には、エクセルの計算式に近いものになりますが、セルを相対参照するのではなく、Fieldの関係性を意識することになります。
Table Calculationは、いくつかシリーズにしないと難しそうなので、ちょっと考えて見ます。
それでは、Enjoy Tableau!
試してみた!データのピボット。ー何列まで可能なの?ー
ポケモン GO! 大人気ですね。
うちの近くの公園でも、若者グループがスマホを片手に、入れ替わり同じあたりをうろうろしてるので、恐らくポケモン GO!をプレイ中なのだと思います。
ところで、ポケモンは、アメリカの子供たちにも大人気で、子供たちには、「アメリカで製作されたアニメ」だと思われています。うちの子供が小学校で「日本のアニメだ」といったら、「うそつけ!」と言われたと言ってました。
さて今回は、タブローの便利機能のひとつ、データのピボットについてです。
機能の詳細は、こちらのリンクで↓
で、私が何をしたいかというと、めっちゃ横に長い元データがあったとして、何列目までピボット可能なの?という調査です。
何列でしょう?
10、25、50、100、250、500、1000、2500、5000
くらいまでデータを準備してやってみました。
さて、データベースに詳しい方は、おおよそ予想がついてしまうように思いますが、答えを知る前に、予想してみてください。
使用したVersionは 9.2 です。
100列のとき
問題ありません。
250列のとき
問題ありません。
500列のとき
255列 までしか表示されません。
255 って、どこかで見たことある数字ですね。
エクセルとか、アクセスとかに限らずいろんなアプリケーションの制限になってます。
私自身、あまりシステムやデータベースの仕様には詳しくないですが、計算速度やシステム容量のバランスの問題から、2^8(2の8乗) とういうのが最大値になることは珍しくないようです。
ということで、列の制限は 255列なのですが、256でなくて、255 ということは。。。
Headerの数を増やして調査してみます。
Header 8列 + データ255列の場合
248 が最大でした。
やはり、Header 列+データ列の合計で制限がかかります。
行の制限
行の数も増やして10000 程度まで試してみましたが、こちらは、機能的には制限がなさそうです。
ただし、列x行でデータ自身の数が増えていくと、反応スピードは落ちてきます。
ということで、答えは、
Header 列+データ列の合計が 256列まで可能です。
それでは、Enjoy Tableau!
出でよゼロ! -Nullをゼロに置き換える- その2(全部で2)
冒頭に、「まくら」がないことに淋しさを感じたので。足してみます。コラムの内容とは全く関係ないですが。。
私の暮らすアメリカの内陸部は、まあ非常に乾燥していて、夏は気持ちがいいのですが、乾燥している分、山火事が多いです。2週間ほど前にも大きなのがあったところなのに、昨日その近くで、また山火事がありました。山火事専門の消防士さんたちがいるのですが、大きな危険を伴う彼らのお仕事に感謝です。
今回は、前回より少し複雑なケースです。
前回のオプション1からスタートです。
上記の各日付に、Customer Segment を追加してみます。
↑ 問題なしです。
さらに、Colorに、"Product Container"を追加してみます。↓
最下段のグラフでおかしな線が表示されています。↓
Measure の ピルを "sales(ZN)" に変えても同様です。↓
バックグラウンドを知るために、クロスタブでチェックしてみます。
グラフをクロスタブにするのは、下記のようにシートを複製することで簡単に実現できます。
多くの空白、つまり"Null" が見られます。↓
ゼロと空白が混在しているのは、簡単に言うと、下記のような状況に依存します。↓
同じ、Consumer x Medium Box の枠ですが、Furnitureは、Null、Office Supplyはゼロが入っています。
横方向にテーブルを見渡したとき、Office Supplyのこのカテゴリにはどこかに数字があるのですが、Furnitureにはどこにもないという状況になっています。
さて、どうすれば良いかというと。。。
Calculated FieldのFormulaを別のものに変更します。
[Sales (ZN,lookup)]
zn(lookup(sum([Sales]),0))
znとlookup を両方使います。
lookupは Table Calculationで、表のFormatに依存して答えを返す関数です。
「0」のところが、例えば「2」であれば、2つ右、あるいは2つ下。
「-2」であれば、2つ左、あるいは2つ上のセルの内容を返します。
この場合、あえて「0」を用いることで、便宜的に、同じセルの内容を一旦計算させて返してくるというアプローチを用いています。
うまくいきました!!
クロスタブで確認すると、全ての欄に「ゼロ」が入っています。
ただし、注意点があります。
Table Calculationには限界があり、これ以上複雑になると、つまりDimensioinが増え、それがColumnとRowに両方入ってくると、対応できなくなります。(例) ↓
それでは、Enjoy Tableau !!
出でよゼロ! -Nullをゼロに置き換える- その1(全部で2、たぶん)
今回は、Nullの扱い方について。
このようなデータのとき、空白のところにはデータ自身が存在しません。
「ゼロ」とは明らかに違う訳です。
が、場合によっては、Nullをゼロ同様に扱いたいこともあります。
具体的にいきましょう。
まずは、棒グラフを書いてみます。
問題ありません。次に、エリアチャートを書いてみます。
ちょっと期待してたのと違います。
中段はよいとして、上段下段は問題です。中段は、もとのテーブルを見ても、もともとNullの項目がありません。ですので、Nullが含まれているときにチャートが分断されているのが分かります。
これを見栄えよくします。
エリアグラフで面を接続する-1
一つ目の方法は、Missing Dataを繋ぐ方法です。
まず、Formatを選択します。Windowを表示させるだけなので、選択は何でもよいです。
Side Barに Formatが表示されます。
Fieldから、[sum(sales)]を選択
いちばん下の、Marksをドロップダウンから選択します。
Hide(Connect Lines)を選択してみると、
こうなりました。繋がったのですが、何か違います。
この選択だと、Null値を飛び越えて、データのあるポイント同士を繋げています。
このパターンが必要なケースはこれでよいですが、今回は、Nullをゼロで表示させることが目標です。
別のオプションを選択します。
これだと。。。
期待通りにできました!!
エリアグラフで面を接続する-2
もうひとつの方法を挙げます。
先ほどは、グラフの表示設定で対応しましたが、セルの中身そのものを、「Null」から「ゼロ」に置き換える方法です。
[Sales (ZN)]
zn(sum([Sales]))
ZNは、Nullのときはゼロを返すという関数です。そのままですね。ただし、
zn([Sales])
のような使い方はできません。それだと、NullはNullのままです。
これをグラフにしてみましょう。
できました~。
シンプルなケースは上記の対応でOKです。
しか~し、上記2つのやり方で、問題が出るケースもあるので~す。
それについては、次回。。
それでは、Enjoy Tableau!!
イライラする前に -フィルタの反応スピードを改善するー
今日は、簡単な作業ノウハウを。。
と言っても、何度も質問を受けたので、ニーズはそれなりにあるように思います。
データフィルタの反応速度に関してです。
私自身も、正直「遅い!!!」と何度も思います。
特に不満を感じるのが、あるFieldにフィルタをかけて、複数のアイテムを抽出する際、
例えば、AAA,BBB,CCC,DDD の4つのアイテムがあったとしましょう。
最初、AAA,BBBでフィルタをかけていて、これをCCC,DDD にフィルタを設定し直したいとき、順番に行うと、以下のような手順になります。
- 初期VIZ (対象1,2選択済み)
- フィルタ「全部表示」選択
- フィルタ「全部非表示」選択
- 「対象3」を選択
- 「対象4」をフィルタに追加
データ、およびフィルタ項目が少なければ大した問題にはなりませんが、大きめのデータを取り扱う場合、もし、一回一回のフィルタ変更に3秒かかったとすると、上記のフィルタ変更だけで、12秒以上かかることになります。
途中で空白のスクリーンが現れたりして、ちょっとストレスフル。
それに思考を中断されている感じが大きいです。
これは、タブローのポリシーの根幹に関わる問題では ないですかっ!!
- それでは、改善策についての説明です。
ひとつめのノウハウ - CTRLを使う-
選択肢が、2~3個でなく、例えば5以上の項目をフィルタしたい時など、一つ一つチェックボックスで選択するのでなく、Ctrlキーを使用して、複数同時選択できます。
そのまま、スペースキーを押下すると、薄くハイライトされた項目のフィルタ、アンフィルタが一括で可能です。
これだと、最後のふたつのステップが、一括で可能です。
3秒ゲイン!
ふたつめの ノウハウ - フィルタのカスタマイズ-
フィルタのオン・オフを A,B 選択から C,D選択など、一旦アンフィルタして、別の項目をフィルタしたい時の作業を軽減します。
フィルタWindowの右上の下向き矢印を選択し、
カスタマイズ==> Show Apply Button とクリックします。
何かが変わりました。
フィルタ項目の最下部に、Apply/Cancel ボタンが現れました。
この機能を使用すれば、複数の項目間のオン・オフを切り替えても、変更は即時に反映されることはありません。"Apply" ボタンをクリックしたときに、新たな選択項目のフィルタが一括適用されます。
"Cancel"をクリックすれば、もともとの選択項目がフィルタされた状態に戻ります。
ただし、注意点があります。
”Apply”をクリックしないと、表示に反映されないので、スクリーン上はフィルタされたっ項目と、グラフのビューがずれている状態になります。
フィルタ項目のFieldがグラフ上に表示されていれば問題ないですが、表示されておらず、データの上でだけフィルタされている場合、判断に間違いが起こる可能性があるので要注意です。
ただし、冒頭に書いた、ストレスフルな反応速度の遅さは、こちらで解消できることと思います。
6秒ゲイン !!
それでは、Enjoy Tableau !
オリンピック、おそるべし XX県! 驚きの金メダル率
もうちょっとタイル地図を使ってみたくなり、別のを作ってみました。
高校野球とか、大臣出身地とかでもそうですけど、自分の出身県の成績とかランキングって何か気になってしまいますよね。。
ちょうど、タブローではオリンピックねたが扱われるようになって来てるので、今回は、都道府県出身者別、メダル獲得数を作ってみました。
大して意味はないといえば意味はないのですが、私としては結構、驚きの結果が。。
先に簡単なグラフの作り方
正解だけ気になる方は、一番下まで一気に移動願います。。。
作り方ですが、各県にColumn(列)と Row(行)の番号を割り振って配置するだけです。少し前に、カレンダーでやったのと基本的に同じやり方です。
カレンダーでは、なるべく「IF」使いたくなかったですけど、今回は特に位置関係と都道府県のコードには関連がないので、IF 的要素を使います。
が、IF ではなく、「Case+When」 を使います。
「IF」よりも、見た目が整理されています。
さて、公開してあるタイル地図に用いた配置は以下の通りです。
[Row ID]
case [Pref Code Int]
when 1 then 1
when 2 then 2
when 3 then 3
when 4 then 4
when 5 then 3
when 6 then 4
when 7 then 5
when 8 then 6
when 9 then 6
when 10 then 6
when 11 then 7
when 12 then 7
when 13 then 8
when 14 then 8
when 15 then 5
when 16 then 6
when 17 then 5
when 18 then 6
when 19 then 7
when 20 then 7
when 21 then 6
when 22 then 8
when 23 then 7
when 24 then 8
when 25 then 7
when 26 then 7
when 27 then 8
when 28 then 7
when 29 then 8
when 30 then 9
when 31 then 7
when 32 then 7
when 33 then 8
when 34 then 8
when 35 then 8
when 36 then 11
when 37 then 10
when 38 then 10
when 39 then 11
when 40 then 9
when 41 then 9
when 42 then 9
when 43 then 10
when 44 then 10
when 45 then 11
when 46 then 11
when 47 then 12
else 12
end
[Column ID]
case [Pref Code Int]
when 1 then -1
when 2 then -2
when 3 then -2
when 4 then -2
when 5 then -3
when 6 then -3
when 7 then -2
when 8 then -1
when 9 then -2
when 10 then -3
when 11 then -2
when 12 then -1
when 13 then -2
when 14 then -3
when 15 then -3
when 16 then -4
when 17 then -5
when 18 then -6
when 19 then -3
when 20 then -4
when 21 then -5
when 22 then -4
when 23 then -5
when 24 then -6
when 25 then -6
when 26 then -7
when 27 then -8
when 28 then -8
when 29 then -7
when 30 then -7
when 31 then -9
when 32 then -10
when 33 then -9
when 34 then -10
when 35 then -11
when 36 then -9
when 37 then -9
when 38 then -10
when 39 then -10
when 40 then -13
when 41 then -14
when 42 then -15
when 43 then -14
when 44 then -13
when 45 then -13
when 46 then -14
when 47 then -15
else -1
end
Column でマイナスを使っているのは、基本設定は上から下、左から右にソートされるので、沖縄が 1 になるようにしても良いのですが、少し問題が。。
都道府県コードは北海道から順につまり、北から南、東から西に順番がつけられています。ですので、上から下、左から右 という順番は、少なくとも日本の都道府県コードとマッチングさせるには、扱いにくいものとなります。
ですので、マイナスを頭につけることで、絶対値が小さい都道府県ほど右(東)であるという認識が持てるようにしています。
あとは、今回はデータに、どの都道府県にもマッチしないアイテムが入っていましたので、それらは左下、座標 「12,-1」に表示させるため、else 以下のTextを追加しています。
あとは、
都道府県の色が、全部のメダル獲得数。中の棒グラフがそれぞれのメダルの獲得数で、2軸を使うため、いくつか表示の工夫が必要です。
今回は、「銅メダル」上のみに都道府県名表示がされるように工夫しました。
さらに、メダルが「0」の県もあったので、これらは、仕方なく、Dummy Dataを追加しました。必要悪?です。
具体的には、47都道府県x金、銀、銅で合計141個のDummy Dataを追加したしています。
これにより、さらに例外回避も必要になってきましたが、詳細は省きます。
タイトル煽ってますよね?
で、どこの県よ?
ってことで、獲得したメダルが「金」ばっかりって県は3県あるのですが、山形、山梨はそれぞれ1個ずつ、それに対して、
奈良県です。
ちょっと驚きませんでしたか?
奈良県をクリックしてもらったら、下に表が出てきます。
何のことはない、柔道、野村忠宏 さんによる3連覇が利いています。しかし、その下にもう一人野村姓が。。。
テーブルの行をクリックすると、ハイパーリンクが現れるので、それをさらにクリックすると、Wiki に飛ぶようになっています。
このあたりは、Dashboard の Action という機能で実現できます。
技術的には簡単なので、タブローのHPでもすぐに見つかります。手間はかかりますが、まあまあ面白いです。
実は、野村豊和さんはお父さん、かと思ったのですが、Wiki によると、伯父様だそうです。それにしてもすごい家系ですね。
ってことで、奈良県民の皆様、(っていうか、ご本人たちはよくご存知かも?!)
大いに自慢してもらっていいと思います!!! 海はないけどな。
ダッシュボードについての説明は、
これとか、
ダッシュボードのアクションを使用したフィルターの作成 | Tableau Software
これですね。
それでは、ご自分でトライして楽しんでください。
これっすよ。作りたかったグラフ -タイルで日本地図ー
以前から気になっていて、トライしてみたかった地図グラフがありました。
似たようなのは、アメリカ版では見たことがあるのですが、これとかですね。
(画像リンク注意)
面白そうだからやってみたかったんですよ。 日本版。
トライしてみました。
こんな感じっす。
はっきり言って、これだけだと、普通の地図に、県ごとに色つければいいんです。付加価値はありません。見た目がちょっと変わってるくらいのことで。。
しか~し、こっちになると、ちょっと付加価値が出てきます。
各 県ごとのグラフが、おおよその県のロケーション上に表示されてます。
地図を簡便化するのって、失敗すると全然ダメですが、作りようによっては面白いものが出来るように思います。
何かを犠牲にしないとうまく簡便化できないので、上図で意識したのは以下のことです。
- 海岸線のつながり。
海のない県を意識しました。海のない県はどの辺も海に面していないハズ。
- 特徴的な地理条件
- 東京の位置
関東はややこしいです。(あんま知らないし)
が、海外の方は、東京の位置がずれすぎてると混乱するでしょうから、できるだけ、東京の隣接県はキープするようにしました。
ただ、海のない県を外に持ってくることはしませんでした。
結果、千葉、茨城と隣接させることはあきらめました。
やらなかったことは下記の事です。
- 県ごとに大きさを変えること
これもやろうと思えば出来るはずですが、手間のわりにあんまり付加価値高くなさそうだと思いました。だいたいの位置が分かれば十分なんで。
- 0.5 きざみの配置
6角形のタイルを配置するイメージでも作成出来ます(画像リンク注意)。
こっちの方が、正直見栄えはよいと思います。
(もう少し地理的特徴を反映させられそうです)
しかし、デメリットもいくつかあるので、採用しませんでした。
ひとつのデメリットは、二つ目のグラフのような時に、スペースのムダが増えてしまうことです。
このサイトも、ちょっと参考にさせて頂きました。
そして、
最終的に行き着いたのが、こちらになります。
作り方はそんなに難しくありませんが、次回にしようと思います。
データはこちらから。
では、ご自分でトライして楽しんでください。
もっとうまい配置があったら、ぜひ教えてください。
Tableau で Calendar その 4 (全部で4)今日は Videoつきだよん。
ようやく最後です。
見せ方の体裁をもう少し整えます。
Dashboard を使えば、ある程度見栄えのよいものはできますが、ひとつのシートでできる範囲のものに、焦点を絞ります。
最大のポイントは、月の名称をどのように表示させるかです。
まず、Header を全て消すと、下記のようなVIZになります。
修正したいことを先に挙げます。
- 曜日表示を短くする
- 月の区分(切れ目)を分かりやすくする。
- 「何月」の表示を入れる
↑ これだけやろうと思います。
<曜日表示を短くする>
曜日の名前は、以下のFormulaで入力されています。
[Weekday Name]
datename('weekday',[Calendar Date])
datenameは、文字列扱いです。
ですので、Mon、Tue などの3文字表記にするために、以下のように変更します。
[Weekday Name]
left(datename('weekday',[Calendar Date]),3)
直りました。
水平方向の表示位置が、真ん中のほうが、いいかな?
Header 位置で右クリックして、Format を選択します。
Header の Alignment を選択します。
水平垂直とも、中央を選んでみます。
ちょっとマシですね。
忘れないうちに、見やすいように、以前に設定した、土日の赤色も追加しておきます。
少し見れるようになってきました。
次です。
<月の区分(切れ目)を分かりやすくする>
罫線の話です。土日を赤くしたら、ある程度は分かりますが、やはり月単位の罫線は欲しいです。
表の中の任意の位置で右クリック、Formatを選択します。
左上のアイコンが、Format 対象を示しています。
こいつが罫線です。
列(縦方向)の罫線を変更したいので、Column Devider を変更します。
ここで、Level を分かりやすくするため、Headerを戻してみます。
列方向には、3レベルのHeaderが設定されています。
以下にLevelごとの見え方の違いを示します。
中央のものが月単位に該当します。
もう少し太くしてもよさそうです。
以下が、罫線の出来上がり版です。罫線の色を変更することもできますが、今回は、初期のもので十分です。
さあ、月の名前表示です。
<「何月」の表示を入れる>
じつは、これには制約が多いです。Dashboard だとかなり融通は利きますが、先に書いたとおり、手間を最小限にするため、ひとつのWorksheet で実現できることに絞ります。
この場合、Header を除くと、データのないところに表示をさせることが出来ないのです。ちょっと透明性を持たせて、各月の中央あたりに表示できるとベストですが、それは無理です。
↓こういうのは無理 ↓ (ちなみにパワーポイントで重ね合わせてます)
でも、できるだけ近いことをしたいと思います。
データのあるところにしか表示できないので、月の、あるに一点だけ、表示させることにします。
「1日」を選ぶと、こんな感じです。
2段目、左端をターゲットにします。
これでもいいかもです。
真ん中にしてみましょう。
やはり、これが、いちばんマシですかね。
さて、それぞれのFormatです。
- 毎月1日
[Show Month 1]
if [Normal day]=1
then left(datename('month',[Calendar Date]),3) END
- 2段目左端
[Show Month 2]
if ([Weekday ID 3]=1 and [Weekday ID 4] = 2 and [Normal day] <> 8 )
then left(datename('month',[Calendar Date]),3)
elseif [Weekday ID 3]=1 and [Weekday ID 4] =1 and [Normal day] = 1
then left(datename('month',[Calendar Date]),3) END
- 真ん中
[Show Month 3]
if [Weekday ID 3]= 4 and [Weekday ID 4] = 3
then left(datename('month',[Calendar Date]),3) END
それぞれ、日付の属性や、Header の属性をうまく工夫して、所定の位置を特定させていることがご理解頂けると思います。
地味に重要なのは、月にひとつしか表示させないことを徹底することです。2段目左端でだいぶ苦労しました。
最後に、Text の配置 です。
日付の情報 1~31と、上記の月の名前を両方 Label にDrag します。
このとき、実は、全ての日付のLabelにも、月の名前が添付されています。
しかしながら、月に一日以外は「null」になっており、どこにも表示されずにいるだけです。
次に文字のFormatです。
Labelの中身は、かなり詳細設定が可能です。
追加したFieldごとにFontや色や配置が変更可能ですし、独自のText入力も可能です。
ここでは、Field ごとに、サイズ、太字、斜体、配置をそれぞれ変更しました。
Field 同士の相対位置も、平行に配置、垂直に配置と選択できることに注意してください。
表示エリアの制約によって、横に並べた方がいい時も、縦に積んだ方がいい時もあります。改行を入れるだけで、縦積みが可能です。
さらにもうひとつ、TIPS ですが、
表示を入れ替えるとき、以下の違いもあるので覚えておいてください。
ようやくカレンダーが終了しました。
それでは、ご自分でトライして、楽しんでください。
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 やりたいと思います。
それでは、ご自分でトライして、楽しんでください。
Tableau で Calendar その2 (全部で3か4)
続きです。
を月曜日始まりにします。
開始曜日を修正する
"weekday" の換算では、Sundayが「1」だったので、月曜日を「1」にするためには。。。
マイナス1にすると、Sundayが「0」になるだけで、変わりません。
こんなのでいけますね。
[Weekday ID 2]
if [Weekday ID] =1 then 7 else [Weekday ID]-1 END
が、なんかズブの素人っぽい ですね。もう少しエレガントに、そして[Calendar Date] から直接計算できる方法を考えます。
[Weekday ID] を計算した後に、If で条件分けするのではなく、日付そのものに手を加えます。
[Weekday ID 2.2]
datepart('weekday',dateadd('day',-1,[Calendar Date]))
[Calendar Date] の一日前の日付の曜日を持ってきてね。としました。
これをカレンダーに持っていって、[Weekday ID] と入れ替えます。
月曜日が先頭に来ました!
が、週の位置がずれてしまいました。
週の番号を修正する
ずれの原因は、
[Week number]
datepart('week',[Calendar Date])
の計算が、日曜日はじまりになっていることが原因です。
さて。。同じことができないか。。
[Week number 2]
datepart('week',dateadd('day',-1,[Calendar Date]))
できました。
基本的にこれでいいんですけど、もうちょっと突っ込みます。
「-1」 って分かりにくいんですよね。金曜日始まりにしたいときは?
「-5」で金曜日です。
これを一目で分かるようにしたいです。
開始曜日を簡単に任意の曜日にする
Date 関連の関数はいろいろあって、そのひとつに、Datetrunc っていうのがあります。
これは、単位期間(年、月、四半期、週、日、時間、分)のスタート時点の値を返す。という使い勝手の良いものです。
上のような感じです。
[Datetrunc Year]
datetrunc('year',[Calendar Date 2])
日付基準の部分(「week」)は、全て小文字である必要があります。
さて、この [datetrunc] 関数ですが、week のときだけ、さらに特別機能があります。
[Datetrunc Week Monday]
datetrunc('week',[Calendar Date 2],'Monday')
のように、後ろに曜日を入れると、直前のその曜日の日付を返してくれるのです。
年とか、月とかは同様の機能はなさそうです。
さて、カレンダーに戻ると、
[Week number 3]
datepart('week',datetrunc('week',[Calendar Date],'Monday'))
[Weekday ID 3]
[Calendar Date]-datetrunc('week',[Calendar Date],'Monday')+1
ということになります。
ID のほうは、日付から直前の月曜日をマイナスすることで日数を計算しています。+1 はおまけで、0 スタートを好むか、1 スタートにするかの差です。
なお、datetrunc は重宝する関数で、例えば月ごとの日数を算出するなどでも使えます。
[Month Days]
datetrunc('month',dateadd('month',1,[Calendar Date 2]))
-
datetrunc('month',[Calendar Date 2])
あるいは、月末の日付特定などです。
[Last Day of Month]
date(datetrunc('month',dateadd('month',1,[Calendar Date 2]))-1)
では、ご自分でトライして楽しんでください。