見出し画像

【Tableau】複数列を使ってOR条件検索をする方法

まとめ

Tableauで複数列でのOR条件検索をするには、パラメーターをデータソースのカスタムSQLに渡すことで実現できます
(他の方法もあるかもしれませんが、私が知っているのはこの方法だけです。他に良い方法があればぜひ教えてください)

前提と注意

今回の例ではデータソースにSnowflakeというデータウェアハウスを使っています。PostgreSQLやMySQLなど他のRDSではtable関数やflatten関数など(後述)がなくて動かないかもしれません。Snowflake以外のデータウェアハウスやRDSを使う際には、それぞれで使える関数に置き換えてください。似たような関数がおそらくあるはずですので、簡単な変更で今回の方法が使えると思います。

例をつかった方がわかりやすいと思うので例を使って解説していきます。

たとえば、あなたがアンケート結果の集計をしたいとしましょう。
あるビールの購入者が、そのビールについて好きな点を3つあげるアンケートだとしましょう。好きな点は順不同であり、1番目が3番目より強い理由というわけではありません。各行が1つのアンケート結果になっており、3人が答えた場合はこんな感じのデータです。

画像1

ここで次の2つのことを知りたいとします。

「ふむふむ、ブランドの影響を知りたいから、好きな点のどこかにブランドが含まれているアンケート結果の数を知りたいなー」
「あー、逆にブランドじゃなくて商品そのものを良いと思って買ってくれた人がどれくらいいるのか知りたいから、価格または味を答えた人はどれくらいいるのか知りたいなー」

しかし、これをTableauのフィルター機能だけでは実現できません。複数列に対してのOR条件はできずAND条件だけであり「好きな点1〜3のどこかにブランドが含まれている」や「好きな点1〜3のどこかに価格または味が含まれている」という検索ができないためです。

では、どうやってこれを実現するのかです。

解決方法

データソースのカスタムSQLとパラメーターを使うことで実現ができます。ここではパラメーターをyou_likeという名前にしています。また好きな点1〜3はyou_like_1~3としています。

SELECT *
FROM beer_survey
WHERE
  (
  -- 初期値のときに、すべての人種が入るような条件にする。ここでは、初期値が空文字なので空文字と比較することで必ず条件が真となるようにする
  <パラメーター.you_like> = '' 
  -- パラメーターには配列などの構造化データは渡せないため、文字列で渡してsplitしてflattenしてtableにして、すべての列と比較することでOR条件を実現する
  OR you_like_1 in (SELECT value FROM TABLE(FLATTEN(INPUT => SPLIT(<パラメーター.you_like>, '|')))) 
  OR you_like_2 in (SELECT value FROM TABLE(FLATTEN(INPUT => SPLIT(<パラメーター.you_like>, '|'))))
  OR you_like_3 in (SELECT value FROM TABLE(FLATTEN(INPUT => SPLIT(<パラメーター.you_like>, '|')))) 
 )

上記のようにカスタムSQLを作成したら、後はパラメーター.you_likeに渡す値を変えることでOR条件を操作することができます。

1つのOR条件:ブランドのみ

「ブランドが含まれているアンケート結果の数を知りたい」のであれば、パラメーター.you_likeに「ブランド」と渡せば良いです。簡単です。

複数のOR条件:価格または味

「価格または味を答えた人はどれくらいいるのか知りたい」のであれば、パラメーター.you_likeに「価格|味」という文字列を渡すことで実現できます。

「|」(縦棒)を渡しているのに気づいたかもしれません。これは適当に決めた区切り文字です。特に「|」でなくともカスタムSQL内のSPLIT関数にわたす区切り文字とパラメーターに渡す区切り文字が一致していれば問題ありません。また、この区切り文字が好きな点1〜3の値に入ってこないことも確認する必要があります。

なぜこんなことをしているのかと言うと、パラメーターには1つの文字列しか渡せない制限があるからです。(もしTableauに詳しい方、渡す方法があれば教えてください)
なので、複数の値を渡すためには「このパラメーターの文字列の中には複数の値が含まれているよ。だからそれを分けてSQLとして処理する必要があるよ」ということを示す必要があります。それを示すのが区切り文字である「|」です。

OR条件なし

すべての結果を表示したいのであればパラメーター.you_likeに空文字を指定することで表示できます。

最後に:お役に立ちましたら

お役に立ちましたぜひスキをお願いいたします。もっと記事を書くモチベーションになります


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