エクセルなら簡単なのに・・・ちょっとややこしい入出庫管理

先日、こんな肩書きを頂戴しました。

www.tableau.com

もちろん、嬉しいのは嬉しいのですが、周りの人達の知識・スキルがものすごいので、ちょっとついてけるかどうか不安です。

下手な解法書いて、別のアンバサダーの人あるいは一般のメンバーから「それは違うと思いま~す」とかダメ出しされるとヘコみそうです。でも頑張ります。

 

今回は、私が最初にコミュニティで答えを教えてもらった案件を再現します。

初期のころは、何も知らずに一人でハマりまくっていました。何時間かけたことでしょう。。。『タブローって、案外使えんなぁ。結局エクセル頼みかよ~』とか思ってたのですが、使えないのは自分だった訳ですね。

 

その案件というのは、以下のようなものです。

データ例

f:id:skn_0410:20160729085244p:plain

日付とSupply、Orderがありまして、計算したいのは、SupplyからOrderを差し引いた残り在庫。

ただし、当たり前ですが、Orderの方が、在庫を上回ってしまうと出庫できないので、そのときはマイナスでなく、「0」を計上する必要があります。

 

  • エクセルだと、どうしたか

エクセルでグラフを書くとこんな感じです。

f:id:skn_0410:20160729085520p:plain

グレーの棒グラフが、その月単月のプラマイを示していて、青色が、単純な累計。

黄色が、望まれる計算を織り込んだ在庫となります。具体的な計算式は、下記のようになりますね。

f:id:skn_0410:20160729090125p:plain

タブローの話の前に、エクセルの計算式を、「=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]) ))

これだとうまくいきません。

こうなります(紫)。

f:id:skn_0410:20160729092432p:plain

 

一瞬、できたかと思うんですけど、普通の累計(茶色)の、マイナス部分が「0」に置き換わっただけです。

 

f:id:skn_0410:20160729092716p:plain

 

過去の Order をさかのぼって満たすことはできないため、実現したいのは下の赤のラインです。

 

f:id:skn_0410:20160729092842p:plain

 

再度、エクセルの計算式を見てみると、

 

f:id:skn_0410:20160729093042p:plain

計算に、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

でもグローバルサイトに日本語で質問しても、別に問題はありません。

community.tableau.com

 

なんか取りとめもなく、長くなってきたので、答えを。。

使うのは、たぶん使用頻度がめっちゃ少ない関数である、「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!