Field calculations allow the hosted feature layer owner or organization administrator to alter the values of every row for a single field in the attribute table of a layer.
For example, if you have a hosted feature layer that stores information on property sales—including the sale price and tax rate for the property location—you could add a field to the layer to store estimated property taxes. To populate the estimated_property_taxes field, define a calculation expression for the field that takes the values in the sale_price field and multiplies them by the tax_rate values.
You have two options when writing calculation expressions on fields in layers in a hosted feature layer:
- Arcade—Arcade is ideal for calculations that require more functionality than SQL, as Arcade provides access to attribute values and feature geometry, allowing you to create expressions that include spatial operations. Additionally, if an error occurs while calculating a particular row, you can stop and troubleshoot the problem, and start the calculation again after you correct the problem.
- SQL—Use SQL for the fastest performance with calculations that can be expressed with standardized SQL (SQL-92) expressions on nonspatial attributes. You can run SQL on sync-enabled hosted feature layers and layers configured to track feature creators and editors; whereas you cannot run Arcade expressions on such layers.
Follow these steps to calculate string, numeric, or date field values in a field.
Note:Field calculations cannot be undone. For this reason, a good practice is to add a field, calculate values into it, and confirm the calculation is what you wanted. If it is, you can then calculate the original field to equal the added field. Once you confirm the values are correct in the original field, you can delete the field you added.
- From the layer's item page, click the Data tab to show the table.
You can also perform these steps from the table in Map Viewer.
- Click the column containing the values you want to calculate.
- Do one of the following to open the Calculate Field dialog box:
- Click Calculate.
- Click Show Detailed View > Calculate
- Choose the language to use for your calculation, either Arcade or SQL.
If the hosted feature layer has sync enabled or is configured to keep track of who creates and updates features, the SQL expression dialog box will open and you will not see this page.
- Compose a calculation expression.
- For SQL, use basic operators, a field list, and functions. Click the Validate button to ensure there are no errors in the expression. If the expression is invalid, click the Remove button and compose a new one. When the expression is complete and valid, click Calculate.
- For Arcade, use global variables, functions, and constants. Click OK to run the expression. If an error occurs when running the expression, you can click Review Error to open the expression window so you can fix the error. Otherwise, click Cancel. If you correct the expression and run it again, the calculation starts over.
The time it takes for the calculation to complete depends on the expression's complexity and the number of features in your layer.
Here are a few simple Arcade expressions that show how you might calculate a field.
Calculate the sum of the values of two numeric fields, Sales2016 and Sales2017, to populate a numeric field.
$feature.Sales2016 + $feature.Sales2017
The following example conditionally writes different string values—None, Low, High, or Other—to a text field based on a number in another field in the layer (HowMany).
$feature.HowMany == 0, "None",
$feature.HowMany == 1, "Low",
$feature.HowMany == 2, "High",
This example calculates a field to the x-coordinate for each point in a point layer.
This example normalizes a raw population value by dividing it by the area (in square miles) of the polygon feature:
$feature.TotalPop / Area ($feature,
Basic SQL operators
On the Calculate Field dialog box, you can build simple SQL expressions using operators such as plus, minus, multiply, and divide. Examples and tips for using these operators are as follows:
- To multiply all values in a numeric field named SAMPLE by 100.0, type SAMPLE * 100.0 for the expression.
- For more complex equations, you can use the parentheses to specify the order of calculations, for example, SAMPLE * (BASELINE - 40).
- Math operators do not work with string fields. You'll need to use the string functions described in the String functions section.
- If you are calculating a field of type double to field of type integer, the CAST function may be automatically added to your expression. For example, if you're calculating a double field named POP to an integer field named SAMPLE, the expression will appear as CAST(SAMPLE AS FLOAT). Do not remove the CAST function. See Numeric functions below for information on the CAST function.
- To include an apostrophe in the string, use two single quotation marks for the apostrophe. For example, 'Nightingale''s'. Do not use a double quotation mark.
After you've created your expression, click the Calculate button. If there are any errors, an error message will appear at the bottom of the dialog box.
The following are additional considerations:
- If you have a filter on your layer, only the records that meet the filter criteria will have their values calculated.
- Calculate Field works only with field names, not field aliases. The Fields list shows you all the field names available for calculations. You can filter this list by the field types String, Numeric, and Date.
- If you hover over a field name in the Fields list, the field alias and field type are displayed.
- If you click a field name in the Fields list, the field is added to the expression.
In addition to simple expressions using operators, you can also use functions to build SQL expressions. Functions work with field names, literals, and other functions. For example, suppose you need to calculate a double field to be TOTALPOP divided by POP18. If any feature has a POP18 equal to zero, the calculation will result in a divide-by-zero error. You can guard against this using the NULLIF function described below. The expression would be TOTALPOP / NULLIF(POP18, 0).
Functions take arguments. In the tables below, any argument can be as follows:
- A field name, as long as the field type matches the argument type (string, number, or date).
- A literal, such as 'Sailboat' (a string surrounded by single quotation marks), the number 5, or a date in MM/DD/YYYY hh:mm:ss format, surrounded by single quotation marks.
- If your organization allows nonstandard SQL queries, non-English characters in a string literal must be escaped with N (for example, N'针叶林').
- A function that returns a value of the proper type (string, number, or date). For example, FLOOR(POWER(SAMP_ERR, 0.5)) returns the largest integer that is less than or equal to the square root of SAMP_ERR.
For illustrative purposes, the examples in the description column of the following tables mostly use literal arguments. You can substitute a field name or another function for these arguments.
Returns the number of characters in the specified string. The result is an integer.
Concatenates two string values.
Only two strings can be provided. To concatenate more than two strings, nest consecutive CONCAT functions as shown in the example below.
Null values are converted to an empty string.
Returns the position of the first occurrence of the specified substring in the string you specify. If the specified substring is not found, the result is 0.
SUBSTRING(<string>, <start>, <length>)
Returns a part of a string value; <start> is an integer index specifying where the returned characters start, and <length> is the number of characters to be returned.
TRIM(BOTH | LEADING | TRAILING ' ' FROM <string>)
Returns a string where all leading or trailing spaces are removed from the string you specify.
Note that the second argument is two single quotation marks with a space between them.
Returns a string where all characters are converted to uppercase.
Returns a string where all characters are converted to lowercase.
Returns the absolute (positive) value of the number you specify
Returns the smallest integer greater than or equal to the specified.
Returns the trigonometric cosine of number, which is assumed to be an angle in radians.
CAST(<number>AS FLOAT | INT)
Converts a number to a different type. FLOAT converts the specified number to a double and INT converts it to an integer.
Returns the largest integer that is less than or equal to the specified number.
The natural logarithm of the specified number.
The base-10 logarithm of the specified number.
Returns the remainder after the dividend (<number>) is divided by the divisor <n>. Both <n> and <number> must be of type integer.
Returns null if the specified number equals the specified value. NULLIF is commonly used to prevent divide-by-zero errors by setting <value> to 0.
Whenever a calculation encounters a null field value in any of its arguments, the result of the calculation is null.
For example, suppose you need to calculate a double field to be TOTALPOP divided by POP18. If any feature has a POP18 value that equals zero, the calculation will result in a divide-by-zero error. You could create a filter to hide records where POP18 is zero, and perform your calculation. A shortcut is to use NULLIF.
POWER(<number> , <y>)
Returns the value of the specified number raised to the specified power (<y>).
ROUND(<number> , <length>)
Rounds the number you specify to the specified length.
If you use a positive number for the <length>, the number is rounded to the decimal position specified by <length>. When <length> is a negative number, the specified <number> is rounded on the left side of the decimal point.
Returns the trigonometric sine of the specified <number>, which is assumed to be an angle in radians.
Returns the tangent of the specified <number>, which is assumed to be an angle in radians.
Truncates the <number> at the specified <decimal_place>.
A positive <decimal_place> truncates to the decimal position specified. When <decimal_place> is a negative number, the <number> is truncated on the left side of the decimal point.
Several calculations can be performed on date fields. For example, you can add or subtract time from a date field or calculate the difference between two date fields.
When working with date fields, keep these important considerations in mind.
You can use any combination of date and number fields and literals when calculating date fields. When using date literals, you must use SQL-supported date formats.
The following date functions are available:
Returns the current date in UTC time.
Returns the current UTC date and time (hours, minutes, seconds).
Returns the current UTC date and time (hours, minutes, seconds, milliseconds).
EXTRACT(<unit> FROM <date>)
Returns a single part (<unit>) of the specified <date>. Possible <unit> values include but are not limited to year, month, day, hour, and minute.
Add time to or subtract time from a date
You may want to add time to or subtract time from a date field or an SQL-supported date literal to produce an updated date field. For example, you can calculate a future inspection or review date by adding time to a date.
The following calculations can be used to add time to or subtract time from a date field. The first one uses date fields and the second uses date literal values. Number fields and number literals can also be used. Any combination of fields and literals is supported, as shown in the third and fourth calculations.
<DateField> +/- <NumberField> = updated date
DATE'<SQL-supported Date Literal>' +/- <Number of Days> = updated date
<DateField> +/- <Number of Days> = updated date
DATE'<SQL-supported Date Literal >' +/- <NumberField> = updated date
The calculated date field is the original date plus or minus the number of days you want to add or subtract. The number of days can be a whole number and can also include a fraction—for example, 1.5 would represent one-and-a-half days, or 36 hours.
In the following example, a piece of machinery is installed 6/14/2016 at 10:00 a.m. You could use either of the following calculations to produce an inspection date one month (30 days) after this installation date. The first calculation uses a date field with a value of 6/14/2016 and a number field with a value of 30, while the second one uses a date literal and a number literal.
<MyDateField> + <MyNumberField> = 7/14/2016 10:00 AM
DATE'6/14/2016' + 30 = 7/14/2016 10:00 AM
Calculate the difference between two dates using SQL
You might want to calculate the length of time between two dates. For example, if you have the installation dates for electric meters and you also have inspection dates, you can calculate the difference between the two dates to verify that the length of time between installation and inspection falls within allowable guidelines. The result of the calculation is a number field rather than a date field.
Any combination of date fields and date literals can be used to calculate the length of time between two dates. The first calculation below uses a date field, while the second uses a date literal. The third and fourth calculations use both a date field and a date literal.
<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
The result is a number field that is calculated by subtracting one date field/literal from another date field/literal. The number result (in days) can be a whole number and can also include a fraction—for example, 1.5 would represent one-and-a-half days, or 36 hours.
In the electric meter inspection example mentioned above, any of the following calculations can be used to calculate the length of time between an installation date of 6/1/2015 and an inspection date of 10/1/2015. The first calculation uses date fields, the second uses date literals, and the third and fourth use both a date field and a date literal.
<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)
Restrictions when calculating field values
- You cannot calculate field values in copies of hosted feature layers or for hosted feature layers that have related tile layers.
- Calculated values are not propagated from the hosted feature layer or view to dependent hosted scene layers.
- Only standardized SQL queries are supported when calculating field values, regardless of the Allow only standard SQL queries setting in the organization's security settings.
- Locale-specific formatting is not supported for numbers in SQL expressions. For example, you must use a decimal point separator for attribute table values rather than a comma separator when the locale is set to Spain.
- You cannot use the numeric MOD function on double fields. Cast the field to an integer as shown in the example.
- You cannot write Arcade expressions for hosted feature layers that have sync enabled or are configured to track who created and last updated features.