---
schema_version: "1"
id: d82cad39f1121f4e6cf645a25a08da84702b5381510e2207856deffe7640e856
title: Tableau での計算作成のベスト プラクティス
collection: tableau
version: next
locale: ja-jp
portal_url: https://docs.salesforce.com/tableau/next/ja-jp/public/desktop/calculations_calculatedfields_bestpractices.md
canonical_url: https://help.tableau.com/v0.0/public/desktop/ja-jp/calculations_calculatedfields_bestpractices.htm
source_site: help.tableau.com
content_type: documentation
content_hash: 545891298140dd34980a3d38149d14b6f344de65d2ba32da127022631a42349e
description: Tips and guidelines for creating efficient calculations in Tableau to optimize workbook performance.
---
[メイン コンテンツに進む](#main-content)

# Tableau での計算作成のベスト プラクティス

## 一般的なルール: 別の計算で計算フィールドを複数回使用するのを避ける

別の計算で同一の計算フィールドを複数回参照すると、パフォーマンスの問題が発生します。計算で計算フィールドを使用する (ネストされた計算の作成としても知られる) 場合には、その計算で 1 回のみ参照するようにしてみてください。

計算でフィールド (ターミナル フィールド) を複数回参照しても、パフォーマンスが低下することはありません。

### 例

複数行の複雑な計算を使用する計算フィールドを作成し、ツイートに含まれるメンションまたは Twitter ハンドルを見つけるとします。計算フィールドはタイトルの付いた Twitter ハンドルです。返される各ハンドルは '@' 記号で始まります (@ユーザーなど)。

分析のため、'@' 記号を削除する必要があります。

これを実行するには、以下の計算を使用して文字列から最初の文字を削除します。

`RIGHT([Twitter Handle], LEN([Twitter Handle]) -1)`

この計算はとてもシンプルです。ですが、Twitter ハンドル計算を 2 回参照しているため、データ ソースの各レコードで計算を 2 回実行します。1 回は RIGHT 関数、もう 1 回は LEN 関数です。

同じ計算を 2 回以上実行するのを回避するには、Twitter ハンドル計算を 1 回のみ使用するように計算を書き直すことができます。この例では、以下のように MID を使用すると、同じ目標を達成できます。

`MID([Twitter Handle], 2)`

## ヒント 1: 複数の等価比較を 1 つの CASE 計算式またはグループに変換する

計算で以下のように、計算フィールド、Person (calc) を複数回使用し、OR 関数が並んでいるとします。この計算の論理式はシンプルではありますが、Person (calc) 計算を最低 10 回実行しているためクエリ パフォーマンスの問題が生じる原因となります。

`IF [Person (calc)] = 'Henry Wilson'   OR [Person (calc)] = 'Jane Johnson'   OR [Person (calc)] = 'Michelle Kim'   OR [Person (calc)] = 'Fred Suzuki'   OR [Person (calc)] = 'Alan Wang'   THEN 'Lead'   ELSEIF [Person (calc)] = 'Susan Nguyen'   OR [Person (calc)] = 'Laura Rodriguez'   OR [Person (calc)] = 'Ashley Garcia'   OR [Person (calc)] = 'Andrew Smith'   OR [Person (calc)] = 'Adam Davis'   THEN 'IC'   END`

等価比較を使用するのではなく、以下の解決策を試してみてください。

### 解決策 1

CASE 式を使用します。例:

`CASE [Person (calc)]   WHEN 'Henry Wilson' THEN 'Lead'   WHEN 'Jane Johnson' THEN 'Lead'   WHEN 'Michelle Kim' THEN 'Lead'   WHEN 'Fred Suzuki' THEN 'Lead'   WHEN 'Alan Wang' THEN 'Lead'      WHEN 'Susan Nguyen' THEN 'IC'   WHEN 'Laura Rodriguez' THEN 'IC'   WHEN 'Ashley Garcia' THEN 'IC'   WHEN 'Andrew Smith' THEN 'IC'   WHEN 'Adam Davis' THEN 'IC'   END`

この例で計算フィールド、Person (calc) は 1 回しか参照されていません。このため、実行されるのは 1 回のみです。また、クエリ パイプラインで CASE 式もさらに最適化されるため、パフォーマンスにおけるメリットはさらに大きくなります。

### 解決策 2

計算フィールドではなくグループを作成します。詳細については、[データのグループ化](https://help.tableau.com/v0.0/public/desktop/ja-jp/sortgroup_groups_creating.htm)を参照してください。

## ヒント 2: 複数の文字列計算を単一の REGEXP 式に変換する

**注**: REGEXP 計算は、Tableau データ抽出を使用している場合のみ、またはテキスト ファイル、Hadoop Hive、Google BigQuery、PostgreSQL、Tableau Data Extract、Microsoft Excel、Salesforce、Vertica、Pivotal Greenplum、Teradata (バージョン 14.1 以上)、および Oracle データ ソースに接続している場合のみ利用できます。詳細については、[その他の関数 (Regex、Hadoop Hive、Google Big Query)](https://help.tableau.com/v0.0/public/desktop/ja-jp/functions_functions_additional.htm)を参照してください。

  

### 例 1: CONTAINS

計算で以下のように、計算フィールド、Category (calc) を複数回使用しているとします。この計算の論理式はやはりシンプルではありますが、Category (calc) 計算を複数回実行しているためクエリ パフォーマンスの問題が生じる原因となります。

`IF CONTAINS([Segment (calc)],'UNKNOWN')   OR CONTAINS([Segment (calc)],'LEADER')   OR CONTAINS([Segment (calc)],'ADVERTISING')   OR CONTAINS([Segment (calc)],'CLOSED')   OR CONTAINS([Segment (calc)],'COMPETITOR')   OR CONTAINS([Segment (calc)],'REPEAT')   THEN 'UNKNOWN'   ELSE [Segment (calc)] END`

何回も繰り返さなくても、REGEXP 式を使用すると同じ結果が得られます。

#### 解決策

`IF REGEXP_MATCH([Segment (calc)], 'UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT') THEN 'UNKNOWN'   ELSE [Segment (calc)] END`

  

同様のパターンを使用する文字列計算では、同じ REGEXP 式を使用できます。

### 例 2: STARTSWITH

`IF STARTSWITH([Segment (calc)],'UNKNOWN')   OR STARTSWITH([Segment (calc)],'LEADER')   OR STARTSWITH([Segment (calc)],'ADVERTISING')   OR STARTSWITH([Segment (calc)],'CLOSED')   OR STARTSWITH([Segment (calc)],'COMPETITOR')   OR STARTSWITH([Segment (calc)],'REPEAT')   THEN 'UNKNOWN'`

#### 解決策

`IF REGEXP_MATCH([Segment (calc)], '^(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)') THEN 'UNKNOWN'   ELSE [Segment (calc)] END`

この解決策では '^' 記号を使用していることに注意してください。

### 例 3: ENDSWITH

`IF ENDSWITH([Segment (calc)],'UNKNOWN')   OR ENDSWITH([Segment (calc)],'LEADER')   OR ENDSWITH([Segment (calc)],'ADVERTISING')   OR ENDSWITH([Segment (calc)],'CLOSED')   OR ENDSWITH([Segment (calc)],'COMPETITOR')   OR ENDSWITH([Segment (calc)],'REPEAT')   THEN 'UNKNOWN'   ELSE [Segment (calc)] END`

#### 解決策

`IF REGEXP_MATCH([Segment (calc)], '(UNKNOWN|LEADER|ADVERTISING|CLOSED|COMPETITOR|REPEAT)$') THEN 'UNKNOWN'   ELSE [Segment (calc)] END`

この解決策では '$' 記号を使用していることに注意してください。

## ヒント 3: LEFT、MID、RIGHT、FIND、LEN ではなく REGEXP を使用して文字列を操作する

正規表現はとても強力なツールになります。複雑な文字列操作を実行する場合には、正規表現の使用を検討してください。多くの場合、正規表現を使用すると、計算はより短く効率的になります。正規表現の詳細については、Tableau ブログの記事[「正規表現になって不完全なデータを処理する (英語)」](https://www.tableau.com/ja-jp/about/blog/2015/6/become-regular-regular-expressions-39802)を参照してください。

### 例 1

計算で以下のように、URL からプロトコルが削除されているとします。たとえば、"https://www.tableau.com" が "www.tableau.com" になっています。

`IF (STARTSWITH([Server], "http://")) THEN   MID([Server], Len("http://") + 1)   ELSEIF(STARTSWITH([Server], "https://")) THEN   MID([Server], Len("https://") + 1)   ELSEIF(STARTSWITH([Server], "tcp:")) THEN   MID([Server], Len("tcp:") + 1)   ELSEIF(STARTSWITH([Server], "\\")) THEN   MID([Server], Len("\\") + 1)   ELSE [Server]   END`

#### 解決策

REGEXP\_REPLACE 関数を使用し、計算を簡潔にしてパフォーマンスを向上できます。

`REGEXP_REPLACE([Server], "^(http://|https://|tcp:|\\\\)", " )`

### 例 2

計算で以下のように、IPv4 アドレスの 2 番目の部分が返されるとします。たとえば、"172.16.0.1" は "16" になります。

`IF (FINDNTH([Server], ".", 2) > 0) THEN   MID([Server],   FIND([Server], ".") + 1,   FINDNTH([Server], ".", 2) - FINDNTH([Server], ".", 1) - 1   )   END`

#### 解決策

REGEXP\_EXTRACT 関数を使用し、計算を簡潔にしてパフォーマンスを向上できます。

`REGEXP_EXTRACT([Server], "\.([^\.]*)\.")`

## ヒント 4: 計算にセットを使用しない

計算にセットを使用している場合、それを等価計算以外の別の要素に置き換えてください。

### 例

計算で以下のように、セットである Top Customers (set) が使用されているとします。

`IF ISNULL([Customer Name]) OR [Top customers (set)] THEN [Segment] ELSE [Customer Name] END`

### 解決策 1

セットがシンプルな場合、同じ結果を返す計算フィールドをセットとして作成できます。例:

`CASE [Customer Name]   WHEN 'Henry Wilson' THEN True   WHEN 'Jane Johnson' THEN True   WHEN 'Michelle Kim' THEN True   WHEN 'Fred Suzuki' THEN True   WHEN 'Alan Wang' THEN True   ELSE False   END`

  

**注**: セットの使用によるパフォーマンスの問題が生じないようにするため、この状況では WHEN TRUE … ELSE のパターンを使用することが推奨されます。これは多くのシナリオで推奨されるパターンではありません。

### 解決策 2

セットがさらに複雑な場合、セットに含まれるすべての要素を 'IN' などの指定した値または属性にマッピングするグループの作成を検討し、その後、その値/属性を確認するように計算を変更してください。例:

`IF ISNULL([Customer Name]) OR [Top Customers(group)]='IN' THEN [Segment] ELSE [Customer Name] END`

詳細については、[データのグループ化](https://help.tableau.com/v0.0/public/desktop/ja-jp/sortgroup_groups_creating.htm)および[セットの作成](https://help.tableau.com/v0.0/public/desktop/ja-jp/sortgroup_sets_create.htm)を参照してください。

## ヒント 5: データのグループ化にセットを使用しない

セットはデータのサブセットを比較することを目的としています。グループはフィールドに含まれる関連するメンバーを組み合わせることを目的としています。以下の例のようにセットをグループに変換することは推奨されていません。

`IF [Americas Set] THEN "Americas"   ELSEIF [Africa Set] THEN "Africa"   ELSEIF [Asia Set] THEN "Asia"   ELSEIF [Europe Set] THEN "Europe"   ELSEIF [Oceania Set] THEN "Oceania"   ELSE "Unknown"   END`

以下の理由で推奨されていません。

- **セットは常には排他的でない**。一部のメンバーは複数のセットに表示されることがあります。たとえば、ロシアは欧州セットとアジア セットのどちらにも配置される可能性があります。
- **セットはグループに常には変換できない**。セットが除外、条件、または制限により定義される場合、同等のグループを作成することが難しい、または不可能な場合さえあるかもしれません。

### 解決策

グループ機能を使用してデータをグループ化します。詳細については、[データのグループ化](https://help.tableau.com/v0.0/public/desktop/ja-jp/sortgroup_groups_creating.htm)を参照してください。

## 関連項目

[Tableau での計算の種類](https://help.tableau.com/v0.0/public/desktop/ja-jp/calculations_calculatedfields_understand_types.htm)

[Tableau で使用する関数](https://help.tableau.com/v0.0/public/desktop/ja-jp/functions.htm)