【計算】TableauにおけるIF/IIF/CASEの違い
なんの記事?
TableauにおけるIF,IIF,CASE以下の使い方及び、使い分けについて
結論
似て非なるIFとIIF
一見するとtypoしそうなIFとIIFですが、いくつかの点で異なります。まずはわかりやすいIFから見てみましょう。
IFの構文は以下のとおりです。
IF <test1> THEN <then1>
[ELSEIF <test2> THEN <then2>...]
[ELSE <default>]
END
具体例を挙げます。青果店の売上データを分析する際、商品を果物か野菜にカテゴリ分けしたいとします。すると、以下のような式になります。
IF "商品" = "りんご" THEN "果物"
ELSEIF "商品" = "にんじん" THEN "野菜"
ELSEIF "商品" = "ぶどう" THEN "果物"
END
これは直感的にもわかりやすいですね。ELSEIFを増やせば無限にパターン分けができるので、3つ以上のパターンに分けたいときにはIFを用います。
次に、IIFを見てみましょう。IIFの構文は以下です。
IIF(<test>, <then>, <else>, [<unknown>])
再び青果店の売上データを使って具体例を挙げます。仮に、月の売上目標が30万円だとして、達成したかどうかを判定したいとします。すると、以下のようなIIFの式になります。
IIF ( SUM(売上) > 300000, "目標達成" , "目標未達" )
ここで、IIFの返り値がブール値であることに注目してください。ブール値とは、値がTRUEまたはFALSEで表現されるものです。ここでは、売上合計が30万円を境にして、超えていればTRUE、超えていなければFALSEが返ってきます。
式の構成上、IIFは特定の条件がTRUEかFALSEかの2つにしか分岐しません。また、返り値はいつでもブール値です。
ちなみに、IIFで表現できるものはIFでも表現ができます。上記のIIFの式を、あえてIFを使って表現すると以下のとおりです。なので好みと言えば好みですが、IIFを使った表現の方がシュッとしていますね。また、Tableauのデータ処理速度もブール値の方がはやくなります。
IF ( SUM(売上) > 300000 THEN TRUE ELSE FALSE END )
ここで、TRUEを"TRUE"としないように留意ください。クオーテーション(””)で囲われるものは文字列扱いになるので、TRUEという文字列が返ってきてしまいます。
IFとIIFの違いをまとめます。
IFを使うシーンとしては、
3つ以上の条件に分岐させたいとき
2つでも返り値を任意のデータ型にしたいとき
IIFを使うシーンとしては、
条件分岐が2つで、かつ返り値がブール値としたいとき
CASEの使いどき
ではCASEはどうでしょうか。まずは構文を見てみましょう。
CASE <expression>
WHEN <value1> THEN <then1>
WHEN <value2> THEN <then2>
...
[ELSE <default>]
END
IFと同様に、青果店の売上データを分析する際、商品を果物か野菜にカテゴリ分けするシーンを想定してみます。
CASE "商品"
WHEN "りんご" THEN "果物"
WHEN "にんじん" THEN "野菜"
WHEN "ぶどう" THEN "果物"
END
IFの式よりもシュッとしましたね。このように、特定の値に何かラベルをつけるときには、CASEの方が短い式で表現できます。
つまり、IFとCASEは一緒?
「じゃあ、IFとCASEは意味合いは同じで好みで使い分ければいいの?」となるかというと、そうではありません。結論から言うとIFの方が汎用性は高く、CASEは指定した値が式と一致するかどうかしかみれません。
青果店の売上データで具体例を挙げます。仮に売上規模に応じて、何かしらのラベルをつけたいとします。
IF SUM(売上) > 500000 THEN "大幅達成!素晴らしい!"
ELSEIF SUM(売上) > 300000 THEN "達成!やったね!"
ELSE "未達!次頑張ろう!"
END
上記の式はIFではできますがCASEではできません。なぜなら、繰り返しですが、CASEは指定した値が式と一致するかを見るので、等号(=)のみで表現できる場合しか使えないためです。
そのため、不等号を使ってパターンを分けたい場合には、今回の3つの式だとIF一択になります。逆に、10種類とか多数のラベリングをしたいときにはCASEの方が簡潔に書けるので向いています。
なお最後に、Tableauに入ってるネイティブ機能(※)で実装できる場合には、そちらの方がパフォーマンスが安定することが多いので、ネイティブ機能で実装できないか?は最初に考えた方が良さそうです
※:ネイティブ機能 = 「独自に書いた計算フィールドではなく、プリセットされてる機能」を指します。今回の事例では、グループ化の機能で十分な場合には、グループ化を使った方がパフォーマンスがいい場合が多い、と言う意味です。
まとめ
IFが最も汎用性が高い(IIFやCASEでできることはIFでもできる)
とはいえ、ブール値で返す場合にはIIFが最も簡潔に表現できる かつ 処理が早い
CASEは複数の項目をラベリングする際に便利
参考記事
この記事が気に入ったらサポートをしてみませんか?