Skip To Content

フィールド値の計算

フィールド演算により、ホスト フィーチャ レイヤー所有者またはポータル管理者は、SQL 式を作成して実行することで、レイヤーの属性テーブル内にある 1 つのフィールドのすべての行の値を変更できます。

たとえば、不動産販売に関する情報 (販売価格やその不動産の所在地の税率などを含む) が格納されたホスト フィーチャ レイヤーが存在する場合には、このレイヤーに、固定資産税の推定値を格納するフィールドを追加できます。estimated_property_taxes フィールドを設定するには、sale_price フィールドの値を取得し、取得した値に tax_rate の値を乗算するように、このフィールドの演算式を定義します。

次のセクションでは、ホスト フィーチャ レイヤーの詳細ページからフィールドの値を算出する方法を説明します。それ以降の各セクションには、一般的な計算の例が示されています。

フィールドの値を計算

フィールド内の文字列、数値、または日付フィールドの値を計算するには、次の手順に従います。

メモ:
フィールドの計算を取り消すことはできません。このため、フィールドを追加して、そのフィールド内で値の計算を実行し、計算が期待通りであることを確認することをお勧めします。計算が期待通りであれば、追加したフィールドと等しくなるように元のフィールドを計算します。元のフィールドの値が正しいことが確認できたら、追加したフィールドを削除します。
  1. レイヤーのアイテム ページで、[データ] タブをクリックしてテーブルを表示します。
    メモ:

    これらの手順は、Map Viewer のテーブルからも実行できます。

  2. 計算する値が含まれている列をクリックします。
  3. 次のいずれかを実行して、[フィールド演算] ダイアログ ボックスを開きます。
    • [計算] をクリックします。
    • [詳細なビューを表示] > [計算] の順にクリックします。
  4. 基本演算子、フィールド リスト、および関数を使用して、演算式を作成します。
  5. 式を作成した後に、[整合チェック] ボタンをクリックして、エラーがないことを確認します。式が無効な場合は、[削除] ボタンをクリックして新しい式を作成します。
  6. フィールド内のすべての値に計算を適用するには、[計算] をクリックします。

計算の完了までにかかる時間は、式の複雑さとレイヤー内のフィーチャ数によって異なります。

計算の例

次の各セクションには、ArcGIS Enterprise ポータルで一般的な計算を実行する場合の構文またはメソッドの例が示されています。

既存の 2 つのフィールド内の数値に対して数値演算を実行して 3 番目のフィールドに値を入力する

実行する最も一般的な計算の 1 つは、フィーチャ レイヤー内の既存の値に基づいて新しい数値を取得する計算です。たとえば、全店舗のある年の売上総額を別の年の売上総額から減算して年ごとの利益の変化を求めたり、18 歳未満の居住者の総数を総人口で除算して 18 歳未満の人口の割合を求めたりすることができます。

SQL の例

数値フィールド (SalesDifference) の計算を実行して、2 つの数値フィールド (Sales2016 と Sales2017) の値の差を求めます。

Sales2016 - Sales2017

18 歳未満の人口の割合を計算して求められた結果の 10 進数値を数値フィールドに入力します。

PopUnder18/TotalPop

既存のフィールドから取得した文字列値を新しい文字列フィールドに連結する

新しいフィールドに値を入力する別の計算には、既存の文字列フィールドの値を連結させる処理が含まれています。たとえば、ホテルの部屋の位置を表す 2 つの文字列フィールド ([階] と [部屋]) があり、これらのフィールドを結合して、両方の値を含む 1 つの文字列フィールドを生成します。

SQL の例

この例では、[階] フィールドと [部屋] フィールドの値が結合されて 1 つのフィールドが生成されます。

CONCAT(Floor,Room)

文字列フィールドから先頭または末尾のスペースを削除する

編集中に値をフィールドに入力したり貼り付けたりした場合に、誤ってテキストの先頭または末尾にスペースが残ることがあります。値の切詰めを行うと、このように誤って残されたスペースを除去することができます。

SQL の例

この例では、編集者が州名を格納するフィールドに「New Hampshire 」という文字列を貼り付けた際に末尾にスペースが残されたことが判明しているため、切詰めを行って文字列の末尾からスペースを除去します。

Trim(TRAILING ' ' FROM 'New Hampshire ')

別のフィールドの値に応じて異なる値をフィールドに入力する

ArcGIS Enterprise でフィールドに書き込まれる値は、フィーチャごとに異なり、同じフィーチャの別の値によって決まることがあります。たとえば、別のフィールド内の数値または省略された文字列値を表すテキストを格納する文字列フィールドをフィーチャ レイヤーに追加することができます。

SQL の例

この種の計算には通常、WHERE 句が使用されますが、ArcGIS Enterprise ポータルの計算インターフェイスは現在、この処理に対応していません。ただし、Map Viewer内のレイヤーにフィルターを適用し、フィルター処理後のフィーチャの値を算出し、そのフィルターを削除し、異なる値を基準にした別のフィルターを適用し、これらのフィールドの値を算出することができます。

たとえば、コード (3、2、および 1) を使用して店舗タイプを記録する数値フィールドがあり、それぞれのコードが表す内容 (チェーン、フランチャイズ、および個人経営) を文字列フィールドに記述する場合は、文字列フィールドをレイヤーに追加し、そのレイヤーをMap Viewerに追加し、コード値ごとにフィルター処理を実行し、その文字列フィールドの値を算出することができます。

  1. ホスト フィーチャ レイヤーに文字列フィールドを追加します。格納する最長の文字列が収まる長さに設定します。

    この店舗タイプの例では、新しいフィールド名は TypeFull です。

  2. このレイヤーの詳細ページの [概要] タブで [マップ ビューアーで開く] をクリックします。
  3. このレイヤーに対してフィルターを定義し、同じタイプのフィーチャだけがマップに表示されるようにします。

    この店舗の例では、StoreCode フィールドの値が 3 のフィーチャだけを返すフィルターを適用します。

  4. このレイヤーの属性テーブルを開きます
  5. 手順 1 で追加したフィールドの名前をクリックしてから [計算] をクリックします。

    この例では、フィールド名 TypeFull をクリックしてから [計算] をクリックします。

  6. 該当するフィーチャのこのフィールドに挿入する文字列を入力します。文字列を単一引用符 ('') で囲みます。

    'chain'」と入力します。この値は、StoreCode3 のすべてのフィーチャの TypeFull フィールドに入力されます。

  7. [計算] をクリックします。
  8. 手順 3 で定義したフィルターを削除します。(このレイヤーの [フィルター] ウィンドウをもう一度開いて [フィルターの削除] をクリックします)。
  9. 算出する残りの値に対して手順 3 ~ 8 を繰り返します。

    この店舗の例では、StoreCode2 のフィルターを定義し、'franchise' の店舗に対して TypeFull を算出します。このフィルターを削除した後、StoreCode1 の新しいフィルターを定義し、'independent' の店舗に対して TypeFull を算出します。

  10. 新しいフィールドの値の計算が終了したら、マップを保存せずにMap Viewerを閉じます。

値を別の値に置き換える

既存の値を別の値に置き換える必要がある場合 (たとえば、特定の値を表現する方法が変更された場合や入力に誤りのある値を修正する必要がある場合)、フィールドの既存の値をすべて検出して、これらの値を新しい値に置き換えることができます。

注意:

計算内容は、フィーチャ レイヤーにすぐに保存されます。誤って既存の値を上書きした場合は、計算をもう一度実行して、元の値に戻す必要があります。

SQL の例

別のフィールドの値に基づいてフィールドに値を入力する場合と同様に、置き換えるフィールド値を含むフィーチャだけを返すフィルターをMap Viewer内のレイヤーに適用することができます。次に、フィルター処理後のフィールドを新しい値と一致させて、フィールドの値を更新します。

たとえば、入力に誤りのある値を修正する必要がある場合や単語を略語に変換する必要がある場合は、変更する必要のある文字列リテラルのフィルター処理を実行し、新しい値と一致するようにフィールドを設定します。

  1. 更新する必要のあるホスト フィーチャ レイヤーをMap Viewerに追加します。

    必ずレイヤー所有者またはポータル管理者でなければなりません。

  2. このレイヤーに対してフィルターを定義し、置き換える値を含むフィーチャだけがマップに表示されるようにします。

    たとえば、StreetType フィールドの値が Crt のフィーチャがいくつか存在することが判明している場合は、StreetType フィールドの値が Crt のフィーチャだけを返すフィルターを適用します。

  3. このレイヤーの属性テーブルを開きます
  4. フィールド名をクリックしてから [計算] をクリックします。

    この例では、フィールド名 StreetType をクリックしてから [計算] をクリックします。

  5. 該当するフィーチャのこのフィールドに挿入する文字列を入力します。文字列を単一引用符 ('') で囲みます。

    'Ct'」と入力します。フィルター処理後の StreetType フィールドに Court の修正済みの略語が入力されます。

  6. [計算] をクリックして、フィルター処理後のフィールドに変更を適用します。
  7. マップを保存せずにMap Viewerを閉じます。

日付への時間の加算と日付からの時間の減算

日付フィールドに時間を加算するか、日付フィールドから時間を減算するか、日付リテラル値を使用して、更新済みの日付フィールドを生成したい場合があります。たとえば、日付に時間を加算して、将来の点検日や再調査日を計算できます。

SQL の例

次の計算に示すように、INTERVAL クエリを使用して、日付フィールドで時間を加算または減算します。最初の例では、日付に 3 日を加算して、新しい日付とします。2 つ目の例では、タイム スタンプ フィールドから 3 日を減算します。

<DateField> + INTERVAL '3'DAY = updated date
<DateField> - INTERVAL '3 00:00:60' DAY TO SECOND = updated date

次の日時の値を指定して、INTERVAL を使用できます。

  • DAY
  • HOUR
  • MINUTE
  • SECOND
  • DAY TO HOUR
  • DAY TO MINUTE
  • DAY TO SECOND
  • HOUR TO MINUTE
  • HOUR TO SECOND
  • MINUTE TO SECOND

2 つの日付間の差の計算

2 つの日付間の時間の長さを計算したい場合があります。たとえば、電気計器の取り付け日が設定され、さらに検査日も設定されている場合、これらの 2 つの日付間の差を計算して、取り付けから検査までの時間の長さが許容可能なガイドラインの範囲内にあることを確認できます。この計算の結果は、日付フィールドではなく数値フィールドです。

SQL の例

2 つの日付間の時間の長さを計算するには、日付フィールドと日付リテラルの任意の組み合わせを使用できます。次に示す 1 番目の計算では日付フィールドが使用され、2 番目の計算では日付リテラルが使用されます。3 番目と 4 番目の計算では、日付フィールドと日付リテラルの両方が使用されます。

<DateField1> - <DateField2> = number of days in between
DATE'<SQL-supported Date Literal>' - DATE'< SQL-supported Date Literal>' = number of days in between
<DateField1> - DATE'<SQL-supported Date Literal>' = number of days in between
DATE'<SQL-supported Date Literal>' - <DateField2>  = number of days in between

この計算結果は、1 つの日付フィールドまたはリテラルを別の日付フィールドまたはリテラルから減算して算出された数値フィールドです。数値結果 (日数) は整数にすることも、小数を含めることもできます。たとえば、1.5 は 1 日半、すなわち 36 時間を表します。

上記の電気計器の検査の例では、次に示すいずれかの計算を使用して、取り付け日「6/1/2015」から検査日「10/1/2015」までの時間の長さを計算できます。1 番目の計算では日付フィールド、2 番目のフィールドでは日付リテラルが使用され、3 番目と 4 番目の計算では日付フィールドと日付リテラルの両方が使用されます。

<InspectionDateField> - <InstallationDateField> = 122 (days)
DATE'10/1/2015' - DATE'6/1/2015' = 122 (days)
<InspectionDateField> - DATE'6/1/2015' = 122 (days)
DATE'10/1/2015' - <InstallationDateField> = 122 (days)

フィールド値を算出する際の考慮事項

  • Map Viewer内のレイヤーにフィルターを適用している場合は、そのフィルター条件を満たしているレコードの値だけが算出されます。
  • SQL 式を作成する場合、[フィールド演算] では、フィールド名のみ使用できます。フィールド エイリアスは使用できません。[フィールド] リストには、計算に使用できるすべてのフィールド名が表示されます。このリストは、[文字列][数値]、および [日付] の各フィールド タイプでフィルタリングできます。
    • [フィールド] リスト内でフィールド名の上にポインターを合わせると、フィールド エイリアスとフィールド タイプが表示されます。
    • [フィールド] リスト内のフィールド名をクリックすると、フィールドが式に追加されます。
  • ホスト フィーチャ レイヤーのコピー、関連するタイル レイヤーがあるホスト フィーチャ レイヤー、ホスト時空間フィーチャ レイヤー、またはホスト時空間フィーチャ レイヤーから作成されたビューでは、フィールド値を計算できません。
  • フィールド値の計算では、標準化された SQL クエリのみがサポートされています。
  • 倍精度型 (double) フィールドには、数値関数 MOD は使用できません。次のに示すように、フィールドを整数に変換します。

標準化された SQL (SQL-92) リファレンス

SQL 式を作成してフィールド値を算出する場合は、標準化された SQL を使用します。このセクションには、ArcGIS Enterprise ポータルでの SQL 計算に使用できる演算子と SQL 関数の一覧が示されています。

SQL 式を作成したら、[計算] ボタンをクリックします。何らかのエラーがある場合は、ダイアログ ボックスの下部にエラー メッセージが表示されます。式の構文を修正して、計算をもう一度実行します。

演算子

[フィールド演算] ダイアログ ボックスでは、加算、減算、乗算、除算などの演算子を使用して、単純な SQL 式を作成できます。これらの演算子の使用例とヒントは次のとおりです。

  • SAMPLE という数値フィールド内のすべての値に 100.0 を乗算するには、式に「SAMPLE * 100.0」と入力します。
  • より複雑な方程式には、括弧を使用して計算順序を指定できます (例: SAMPLE * (BASELINE - 40))。
  • 算術演算子は、文字列フィールドには使用できません。「文字列関数」セクションで説明する文字列関数を使用する必要があります。
  • double タイプのフィールドを整数タイプのフィールドに変換する場合、式に CAST 関数が自動的に追加されることがあります。たとえば、POP という double フィールドを SAMPLE という整数フィールドに変換する場合、式は CAST(SAMPLE AS FLOAT) と表示されます。CAST 関数を削除しないでください。CAST 関数の詳細については、以下の「数値関数」をご参照ください。
  • 文字列にアポストロフィを含める場合は、アポストロフィとして、2 つの単一引用符を使います。例: 'Nightingale''s'。二重引用符は使用しないでください。

関数

演算子を使用した単純な式だけでなく、関数を使用して SQL 式を作成することもできます。関数には、フィールド名、リテラル、その他の関数を使用できます。たとえば、TOTALPOPPOP18 で除算する double フィールドを計算する必要があるとします。フィーチャにゼロの POP18 が含まれている場合に、この計算を実行すると、ゼロ除算エラーが発生します。後述の NULLIF 関数を使用すると、これを防ぐことができます。式は、TOTALPOP / NULLIF(POP18, 0) のようになります。

関数は引数を取ります。以下のテーブルでは、次のような引数を使用できます。

  • フィールド タイプが引数のタイプ (文字列、数値、または日付) と一致するフィールド名。
  • 'Sailboat' (単一引用符で囲まれた文字列) などのリテラル、数字の 5、または単一引用符で囲まれた MM/DD/YYYY hh:mm:ss 形式の日付。
  • 適切なタイプ (文字列、数値、または日付) の値を返す関数。たとえば、FLOOR(POWER(SAMP_ERR, 0.5)) は、SAMP_ERR の平方根以下で最大の整数を返します。

わかりやすいように、次のテーブルの説明列にあるほとんどの例では、リテラルの引数を使用しています。これらの引数をフィールド名や別の関数に置き換えることができます。

日付関数

日付フィールドでは数種類の計算を実行できます。たとえば、日付フィールドでの時間の加算/減算や、2 つの日付フィールド間の差の計算を実行できます。

日付フィールドを操作する前に、重要な考慮事項に目を通しておく必要があります。

日付フィールドを計算するときは、日付および数値フィールド/リテラルの任意の組み合わせを使用できます。日付リテラルを使用する場合、SQL でサポートされている日付形式を使用する必要があります。

使用可能な日付関数としては、次のものがあります。

関数説明

CURRENT_DATE

現在の日付を UTC 時間で返します。

クライアントに表示される内容は、使用しているクライアントによって異なります。ポータル Web サイトの日付は、ブラウザーのタイム ゾーンで表示されます。

次の例では、日付が今日の日付より後の [inspection_date] フィールドの値がすべて返されます。

inspection_date > CURRENT_DATE

CURRENT_TIMESTAMP

現在の UTC の日付と時刻 (時間、分、秒) を返します。

クライアントに表示される内容は、使用しているクライアントによって異なります。ポータル Web サイトの時刻は、ブラウザーの現地時間で表示されます。

次の例では、今日の日付と現在の時刻 (UTC 時間) より前のタイムスタンプ値がすべて appointments フィールドに返されます。

appointments < CURRENT_TIMESTAMP

EXTRACT(<unit> FROM '<date>')

指定した <unit> の一部 (<date>) を返します。可能な <unit> 値には、年、月、日、時間、分が含まれます (これらに限定されません)。

次のようなケースがあります。

  • EXTRACT(MONTH FROM '12-21-2016') - 12 を返します。
  • EXTRACT(DAY FROM '12-21-2016 12:00')- 21 を返します。
  • EXTRACT(HOUR FROM '12-21-2016 15:00:44')- 15 を返します。

数値関数

関数説明

ABS(<number>)

指定した数値の絶対値 (正の値) を返します。

CEILING(<number>)

指定した数値以上で、最も小さな整数を返します。

  • CEILING(12.93) - 結果は 13 です。

COS(<number>)

<number> の角度の余弦を返します。角度の単位はラジアンです。

CAST(<number>AS FLOAT | INT)

数値を別のタイプに変換します。FLOAT は指定した number を double に変換し、INT は整数に変換します。

FLOOR(<number>)

指定した number 以下の最も大きい整数を返します。

  • FLOOR(12.93) - 結果は 12 です。

LN(<number>,<decimal_place>)

指定した number の自然対数。

LOG(<number>,<decimal_place>)

指定した number の常用対数です。

MOD(<number>, <n>)

被除数 (<number>) を除数 <n> で除算したときの余りを返します。<n> と <number> のタイプは、整数である必要があります。

次のようなケースがあります。

  • MOD(10, 4) - 結果は 2 です。
  • MOD(CAST(DBLFIELD AS INT), 4) - DBLFIELD はタイプが double のフィールドであるため、値を double から整数に変換するために CAST 関数が必要です。

NULLIF(<number>, <value>)

指定した number が指定した値と同じ場合、null を返します。NULLIF は、<value> を 0 に設定してゼロ除算エラーを防ぐためによく使用されます。

引数のフィールド値が null であった場合、計算結果は null です。

たとえば、TOTALPOPPOP18 で除算する double フィールドを計算する必要があるとします。 フィーチャにゼロである POP18 値が含まれている場合に、この計算を実行すると、ゼロ除算エラーが発生します。この場合、POP18 がゼロであるレコードを非表示にするフィルターを作成して、計算を実行できます。この場合、NULLIF を使用すると簡単です。

  • TOTALPOP / NULLIF(POP18, 0) - POP18 がゼロと等しい場合は null を返し、それ以外の場合は TOTALPOP / POP18 の値を返します。

POWER(<number> , <y>)

指定した number を指定した乗数 (<y>) で累乗した値を返します。

ROUND(<number> , <length>)

指定する number を指定した長さに丸めます。

<length> に正の数を使用する場合、数値は <length> で指定された小数点以下の桁数に丸められます。<length> が負の数の場合、指定した <number> は小数点の左側が丸められます。

  • ROUND(10.9934,2) - 10.99 を返します。
  • ROUND(10.9964,2) - 11.00 を返します。
  • ROUND(111.0,-2) - 100.00 を返します。

SIN(<number>)

指定した <number> の角度の正弦を返します。角度の単位はラジアンです。

TAN(<number>)

指定した <number> の角度の正接を返します。角度の単位はラジアンです。

TRUNC(<number>,<decimal_place>)

指定した <number><decimal_place> を切り捨てます。

<decimal_place> が正の場合、指定した小数点以下の桁数に切り捨てられます。<decimal_place> が負の数の場合、<number> は小数点の左側が丸められます。

  • TRUNC(111.996,2) - 111.99 を返します。
  • TRUNC(111.996,-2) - 100.00 を返します。

文字列関数

関数説明

CHAR_LENGTH(<string>)

指定した string の文字数を返します。結果は整数です。

  • CHAR_LENGTH('Redlands') - 結果は 8 です。

CONCAT(<string1>, <string2>)

2 つの文字列値を連結します

指定できるのは、2 つの文字列だけです。3 つ以上の文字列を連結するには、次のように CONCAT 関数を連続して使用してネストします。

  • CONCAT('A', 'B') - 結果は 'AB' です。
  • CONCAT('A', CONCAT(':', 'B')) - 結果は 'A:B' です。

NULL 値は空の文字列に変換されます。

POSITION(<substring> in <string>)

指定する string 内で指定した substring が最初に現れる位置を返します。指定した substring が見つからない場合、結果は 0 になります。

  • POSITION('boat'in 'Sailboat') - 結果は 5 です。
  • POSITION('motor'in 'Sailboat') - 結果は 0 です。

SUBSTRING(<string>, <start>, <length>)

string の値の一部を返します。<start> は、返される文字列の開始位置を指定する整数インデックスであり、<length> は返される文字数です。

  • SUBSTRING('Sailboat', 5, 4) - 結果は 'boat' です。
  • SUBSTRING('Sailboat', 1, 4) - 結果は 'Sail' です。
  • SUBSTRING('Sailboat', 5, 100) - 結果は 'boat' です。

TRIM(BOTH | LEADING | TRAILING ' ' FROM <string>)

指定する string の先頭または末尾にあるすべての空白を削除した文字列を返します。

  • TRIM(BOTH ' ' FROM ' San Bernardino ') - 結果は 'San Bernardino' です。

2 つ目の引数は、1 つの空白を囲んだ 2 つの単一引用符である点に注意してください。

UPPER(<string>)

すべての文字を大文字に変換した文字列を返します。

  • UPPER('Sailboat') - 結果は 'SAILBOAT' です。

LOWER(<string>)

すべての文字を小文字に変換した文字列を返します。

  • LOWER('Sailboat') - 結果は 'sailboat' です。