【計算】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は複数の項目をラベリングする際に便利

参考記事

この記事が気に入ったらサポートをしてみませんか?