> ## Documentation Index
> Fetch the complete documentation index at: https://help.dingtalk.io/llms.txt
> Use this file to discover all available pages before exploring further.

# レポート数式

> YiDA レポートで利用できるカスタム数式を解説します。論理・文字列処理・集計・配列関数の使い方と実践例を紹介し、フォームの生データを目的に応じて加工・可視化する方法をわかりやすく説明します。

## 1. ユースケース

生のフォームデータをそのまま表示できず、カスタムロジックで加工してから表示する必要がある場合があります。

例：

* フォームデータは従業員個人が送信しますが、レポートには毎日フォームを送信した従業員の人数を表示したい場合。この場合、COUNT() 関数で結果を算出してから表示します。
* フォームにカスタムフィールドを追加し、ページ遷移用のハイパーリンクにひもづけたい場合。このシーンでもカスタム数式フィールドが役立ちます。

これらのニーズに対応するため、まず YiDA がレポート用に提供している数式を確認します。数式は以下のカテゴリに分類されます。

* 論理
* 文字列処理
* 集計
* 配列

## 3. 数式の設定場所

**パス**：レポート作成 >> レポート設計ページ >> データセットを選択 >> 表示列フィールドを選択 >> FX >> 数式を設定

以下の動画で設定方法をご確認ください。

## 4. 論理

### CASEWHEN

**使い方 1**：CASEWHEN(\<condition>,\<value>,\<condition>,\<value>.....)。SQL の CASE WHEN 構文と同等です。

**例**：CASEWHEN(\<性別フィールド>="Male","男性",\<性別フィールド>="Female","女性")。「Male」の値は「男性」に、「Female」の値は「女性」に置換されます。

**使い方 2**：CASEWHEN(\<condition>,\<value>,\<condition>,\<value>.....\<value>)。SQL の CASE WHEN 構文と同等です。

**例**：CASEWHEN(\<性別フィールド>="Male","男性","女性")。「Male」の値は「男性」に、それ以外の値はすべて「女性」に置換されます。

## 5. 文字列処理

### LEN

**使い方**：LEN(\[文字列フィールド])。文字列の長さを返します。

**例**：LEN("test") は 4 を返します。LEN("测试") は 2 を返します。中国語 1 文字は英字 1 文字と同様に 1 文字として数えられます。

### LEFT

**使い方**：LEFT(\<Measure フィールド>,\< n >)。\<フィールド> の値の左端から n 文字分の文字列を返します。

**例**：LEFT(Field1,3)。Field1 が "ABCDEF" の場合、戻り値は "ABC" です。

### RIGHT

**使い方**：RIGHT(\<Measure フィールド>,\< n >)。\<フィールド> の値の右端から n 文字分の文字列を返します。

**例**：RIGHT(Field1,3)。Field1 が "ABCDEF" の場合、"DEF" を返します。

### MID

**使い方**：MID(\<Measure フィールド>, \< start >, \< n >)。\<フィールド> の値の左端から start 文字目より n 文字分の文字列を返します。

**例**：MID(Field1, 3, 3)。Field1 が "ABCDEF" の場合、"CDE" を返します。

### POS

**使い方**：POS(\<Measure フィールド>,\<サブ文字列>)。\<text> における \<サブ文字列> の位置を返します。一致するものがない場合は 0 を返します。

**例**：POS(Field1,"DE")。Field1 が "ABCDEF" の場合、4 を返します。

### UPPER

**使い方**：UPPER(\<Measure フィールド>)。\<フィールド> の値を大文字に変換します。

**例**：UPPER(Field1)。Field1 が "AbcdeF" の場合、"ABCDEF" を返します。

### LOWER

**使い方**：LOWER(\<Measure フィールド>)。\<フィールド> の値を小文字に変換します。

**例**：LOWER(Field1)。Field1 が "AbcdeF" の場合、"abcdef" を返します。

### VAL

**使い方**：VAL(\<Measure フィールド>)。\<フィールド> の値をテキストから数値タイプに変換します。

**例**：VAL(Field1)。Field1 が "123" の場合、123 を返します。

### LEFTTRIM

**使い方**：LEFTTRIM(\<Measure フィールド>)。\<フィールド> の値から先頭の空白を削除します。

**例**：LEFTTRIM(Field1)。Field1 が "  ABC" の場合、"ABC" を返します。

### RIGHTTRIM

**使い方**：RIGHTTRIM(\<Measure フィールド>)。\<フィールド> の値から末尾の空白を削除します。

**例**：RIGTTRIM(Field1)。Field1 が "ABC  " の場合、"ABC" を返します。

### NUMBERTOSTRING

**使い方**：NUMBERTOSTRING(\<数値>)。数値データを文字列に変換します。

**例**：NUMBERTOSTRING(Field1)。Field1 が "12345 " の場合、"12345" を返します。

### SPLITPART

**使い方**：SPLITPART(\<文字列フィールド>, 区切り文字, サブ文字列の位置)。文字列を「区切り文字」で N 個のサブ文字列に分割します（N は区切り文字の数 + 1）。サブ文字列の位置は、1 から始まる（左から右）または -1 から始まる（右から左）カウントで指定します。

**例**：SPLITPART(\<Field1>,A,2)。Field1 が "ABCDABHABC" の場合、"BCD" を返します。サブ文字列の位置を -5 に設定した場合も "BCD" を返します。

### CONCAT

**使い方**：CONCAT(\<フィールド>,\<フィールド>,.....)。複数のフィールドを 1 つの文字列に連結します。入力パラメータは文字列型フィールドである必要があります。

**例**：CONCAT(\<Field1>,\<Field2>)。Field1 が "A"、Field2 が "BCD" の場合、"ABCD" を返します。

### REPLACE

**使い方**：REPLACE(\[string], \[search string], \[replacement string])。置換後の文字列を返します。

**例**：REPLACE(\[Field1], \[Field2], \[Field3])。Field1 が "abcdefg"、Field2 が "bcd"、Field3 が "12345" の場合、"a12345efg" を返します。

### STRINGTONUMBER

新しい文字列処理レポート数式 `STRINGTONUMBER()` は、テキスト型の数値を数値型に変換します。

本数式は現時点でレポートページでのみサポートされます。以下のように使用します。

```javascript theme={"theme":{"light":"github-light","dark":"github-dark"}}
// フィールドはテキスト型の数値である必要があります。
STRINGTONUMBER(<Field>)
```

## 6. 集計

集計フィールドの動作を示すため、以下では 2 つの実践的なサンプルデータセットを使用します。

以下の「サンプルデータセット 1」および「サンプルデータセット 2」は、複数のフォームから収集されたものと仮定します。

**サンプルデータセット 1**

データセット

| BU     | 部門        | 予算タイプ     | 支出  |
| ------ | --------- | --------- | --- |
| xxpt   | コラボレーション  | チームビルディング | 500 |
| xxpt   | コラボレーション  | 研修        | 200 |
| xxpt   | IT        | チームビルディング | 700 |
| xxpt   | IT        | 研修        | 150 |
| aliyun | Feitian 1 | チームビルディング | 200 |
| aliyun | Feitian 1 | 研修        | 100 |

スプレッドシート

| BU     | 部門        | 部門支出合計 |
| ------ | --------- | ------ |
| xxpt   | コラボレーション  | 700    |
| xxpt   | IT        | 850    |
| aliyun | Feitian 1 | 300    |

**サンプルデータセット 2**

データセット

| BU     | 部門        | 予算タイプ     | 支出  |
| ------ | --------- | --------- | --- |
| xxpt   | コラボレーション  | チームビルディング | 500 |
| xxpt   | コラボレーション  | 研修        | 200 |
| xxpt   | コラボレーション  | チームビルディング | 500 |
| xxpt   | コラボレーション  | 研修        | 200 |
| xxpt   | IT        | チームビルディング | 700 |
| xxpt   | IT        | 研修        | 150 |
| xxpt   | eHR       | 研修        | 0   |
| xxpt   | eHR       | チームビルディング | 0   |
| aliyun | Feitian 1 | チームビルディング | 200 |
| aliyun | Feitian 1 | 研修        | 100 |

スプレッドシート

| BU     | 部門        | 予算タイプ     |
| ------ | --------- | --------- |
| xxpt   | コラボレーション  | チームビルディング |
| xxpt   | コラボレーション  | 研修        |
| xxpt   | IT        | チームビルディング |
| xxpt   | IT        | 研修        |
| xxpt   | eHR       | 研修        |
| xxpt   | eHR       | チームビルディング |
| aliyun | Feitian 1 | チームビルディング |
| aliyun | Feitian 1 | 研修        |

### SUM

**使い方**：SUM(\<Measure フィールド>,\[condition],\[除外フィールド])。\[condition] に一致する \<フィールド> の値の合計を返します。\[除外フィールド] は合計のクロス計算に加算されません。

**例**：サンプルデータセット 1 を使用します。

部門チームビルディング支出 = SUM(支出, 予算タイプ="チームビルディング")：

<Warning>
  レポートの集計関数は現時点で論理演算に対応していません。
</Warning>

スプレッドシート結果

| BU     | 部門        | 部門支出合計 | 部門チームビルディング支出 |
| ------ | --------- | ------ | ------------- |
| xxpt   | コラボレーション  | 700    | 500           |
| xxpt   | IT        | 850    | 700           |
| aliyun | Feitian 1 | 300    | 200           |

BU チームビルディング支出 = SUM(支出, 予算タイプ="チームビルディング", 部門)：

スプレッドシート結果

| BU     | 部門        | 部門支出合計 | 部門チームビルディング支出 | BU チームビルディング支出 |
| ------ | --------- | ------ | ------------- | -------------- |
| xxpt   | コラボレーション  | 700    | 500           | 1200           |
| xxpt   | IT        | 850    | 700           | 1200           |
| aliyun | Feitian 1 | 300    | 200           | 200            |

### AVG

**使い方**：AVG(\<Measure フィールド>,\[condition],\[除外フィールド])

**説明**：\[condition] に一致する \<フィールド> の値の平均を返します。\[除外フィールド] は合計のクロス計算に加算されません。

**例**：サンプルデータセット 1 を使用します。

* BU ごとの平均チームビルディング支出を計算

<Warning>
  レポートの集計関数は現時点で論理演算に対応していません。
</Warning>

平均チームビルディング支出を計算するには、予算タイプが「チームビルディング」のレコードのみを対象とします。したがって、支出フィールドを \<measure フィールド> として選択し、\[condition] に 予算タイプ="チームビルディング" を設定します。各 BU には複数の部門があり、計算では部門を無視するため、\[除外フィールド] に部門フィールドを追加します。

**数式**：BU 平均チームビルディング支出 = AVG(支出, 予算タイプ="チームビルディング", 部門)：

**スプレッドシート結果：**

| BU     | 部門        | 部門支出合計 | 部門平均チームビルディング支出 |
| ------ | --------- | ------ | --------------- |
| xxpt   | コラボレーション  | 700    | 600             |
| xxpt   | IT        | 850    | 600             |
| aliyun | Feitian 1 | 300    | 200             |

* 全体の平均チームビルディング支出を計算

全体の平均チームビルディング支出を計算するには、予算タイプが「チームビルディング」のレコードのみを対象とします。したがって、支出フィールドを \<measure フィールド> として選択し、\[condition] に 予算タイプ="チームビルディング" を設定します。BU や部門を問わずすべての部門にわたるチームビルディング支出を合計するため、\[除外フィールド] に部門フィールドと BU フィールドの両方を追加します。

**数式**：全体平均チームビルディング支出 = AVG(支出, 予算タイプ='チームビルディング', 部門, BU)：

**スプレッドシート結果：**

| BU     | 部門        | 部門支出合計 | 部門平均チームビルディング支出 | 全体平均チームビルディング支出 |
| ------ | --------- | ------ | --------------- | --------------- |
| xxpt   | コラボレーション  | 700    | 600             | 466.67          |
| xxpt   | IT        | 850    | 600             | 466.67          |
| aliyun | Feitian 1 | 300    | 200             | 466.67          |

### MAX

**使い方**：MAX(\<Measure フィールド>,\[condition],\[除外フィールド])。\[condition] における \<フィールド> の最大値を返します。\[除外フィールド] は合計のクロス計算に加算されません。

**例**：サンプルデータセット 1 を使用します。

部門最大チームビルディング支出 = MAX(支出, 予算タイプ='チームビルディング')：

<Warning>
  レポートの集計関数は現時点で論理演算に対応していません。
</Warning>

スプレッドシート結果

| BU     | 部門        | 部門支出合計 | 部門最大チームビルディング支出 |
| ------ | --------- | ------ | --------------- |
| xxpt   | コラボレーション  | 700    | 500             |
| xxpt   | IT        | 850    | 700             |
| aliyun | Feitian 1 | 300    | 200             |

BU 最大チームビルディング支出 = MAX(支出, 予算タイプ="チームビルディング", 部門)：

スプレッドシート結果

| BU     | 部門        | 部門支出合計 | 部門平均チームビルディング支出 | BU 最大チームビルディング支出 |
| ------ | --------- | ------ | --------------- | ---------------- |
| xxpt   | コラボレーション  | 700    | 600             | 700              |
| xxpt   | IT        | 850    | 600             | 700              |
| aliyun | Feitian 1 | 300    | 200             | 200              |

### MIN

**使い方**：MIN(\<Measure フィールド>,\[condition],\[除外フィールド])。\[condition] における \<フィールド> の最小値を返します。\[除外フィールド] は合計のクロス計算に加算されません。

**例**：サンプルデータセット 1 を使用します。

部門最小チームビルディング支出 = MIN(支出, 予算タイプ="チームビルディング")：

<Warning>
  レポートの集計関数は現時点で論理演算に対応していません。
</Warning>

スプレッドシート結果

| BU     | 部門        | 部門支出合計 | 部門最小チームビルディング支出 |
| ------ | --------- | ------ | --------------- |
| xxpt   | コラボレーション  | 700    | 500             |
| xxpt   | IT        | 850    | 700             |
| aliyun | Feitian 1 | 300    | 200             |

BU 最小チームビルディング支出 = MIN(支出, 予算タイプ="チームビルディング", 部門)：

スプレッドシート結果

| BU     | 部門        | 部門支出合計 | 部門平均チームビルディング支出 | BU 最小チームビルディング支出 |
| ------ | --------- | ------ | --------------- | ---------------- |
| xxpt   | コラボレーション  | 700    | 600             | 500              |
| xxpt   | IT        | 850    | 600             | 500              |
| aliyun | Feitian 1 | 300    | 200             | 200              |

### COUNTDISTINCT

**使い方**：COUNTDISTINCT(\<Measure フィールド>,\[condition],\[除外フィールド])。\[condition] における \<フィールド> の一意な値の数を返します。\[除外フィールド] は合計のクロス計算に加算されません。

**例**：サンプルデータセット 2 を使用します。

BU 部門数 = COUNTDISTINCT(部門, 支出>0, 予算タイプ)

<Warning>
  レポートの集計関数は現時点で論理演算に対応していません。
</Warning>

スプレッドシート結果

| BU     | 部門        | 予算タイプ     | BU 部門数 |
| ------ | --------- | --------- | ------ |
| xxpt   | コラボレーション  | チームビルディング | 1      |
| xxpt   | コラボレーション  | 研修        | 1      |
| xxpt   | IT        | チームビルディング | 1      |
| xxpt   | IT        | 研修        | 1      |
| aliyun | Feitian 1 | チームビルディング | 1      |
| aliyun | Feitian 1 | 研修        | 1      |

### COUNT

**使い方**：COUNT(\<Measure フィールド>,\[condition],\[除外フィールド])。\[condition] における \<フィールド> の値のカウントを返します。\[除外フィールド] は合計のクロス計算に加算されません。

**例**：サンプルデータセット 2 を使用します。

部門予算レコード数 = COUNT(部門, 支出>0, 予算タイプ)

<Warning>
  レポートの集計関数は現時点で論理演算に対応していません。
</Warning>

スプレッドシート結果

| BU     | 部門        | 予算タイプ     | BU 部門数 |
| ------ | --------- | --------- | ------ |
| xxpt   | コラボレーション  | チームビルディング | 4      |
| xxpt   | コラボレーション  | 研修        | 4      |
| xxpt   | IT        | チームビルディング | 2      |
| xxpt   | IT        | 研修        | 2      |
| aliyun | Feitian 1 | チームビルディング | 2      |
| aliyun | Feitian 1 | 研修        | 2      |

## 7. 日付と時刻

### NOW

**使い方**：NOW()。現在時刻を秒単位で返します。

**例**：省略。

### STRINGTODATE

**使い方**：STRINGTODATE(\<フィールド>,\<フォーマット>)。文字列を日付／時刻値に変換します。

**例**：STRINGTODATE("1989-09-27","yyyy-MM") は "198909" を返します。

上記 2 つの関数のフォーマットは Java のフォーマット規則に従います。サポートされるフォーマットタイプは以下のとおりです。

yyyy：年

MM：月

dd：日

hh：12 時間制（1-12）

HH：24 時間制（0-23）

mm：分

ss：秒

### DATEADD

**使い方**：`DATEADD(<日付フィールド>,<オフセット>,<時間粒度>)`。\<日付フィールド> に指定した **\<時間粒度>** の \<オフセット> を加算します。

* 時間粒度の値：

* オフセットは加算または減算する具体的な数値です。正の値は加算、負の値は減算を表します。

**例 1：**

フォーム内の日付コンポーネントの値が "20200901" の場合、`DATEADD(日付コンポーネント,10,"DAY") = 20200911` となります。

**例 2：**

フォーム内の日付コンポーネントの値が "20200901" の場合、`DATEADD(日付コンポーネント,-1,"DAY") = 20200831` となります。

<Note>
  日付のデフォルト表示フォーマットは `yyyyMMdd` です。日付表示フォーマットを変更する方法については、[**DATEFORMAT 関数**](/ja/yida/form/yrofmw) の例を参照してください。
</Note>

### DATEDIFF

**使い方**：DATEDIFF(\<時間フィールド 1>,\<時間フィールド 2>,\<時間粒度>)。時間フィールド 1 と時間フィールド 2 の差を、指定した時間粒度で返します。

時間粒度のオプション：

* YEAR       年
* MONTH    月
* DAY        日
* HOUR      時
* MINUTE   分
* SECOND  秒

**例**：DATEDIFF(日付コンポーネント 1, 日付コンポーネント 2, "DAY")。2 つの日付コンポーネントの間の日数を返します。

**注意：パラメータは日付コンポーネントのみをサポートします。数式内に固定の日付値を直接入力することはできません。**

フォーム内の日付コンポーネントの日付値が "2020-02-14" で本日が "2020-02-16" の場合、

DATEDIFF(NOW(), 送信日, "DAY") = 2

DATEDIFF(送信日, NOW(), "DAY") = -2

### DATEFORMAT

**使い方**：DATEFORMAT(\<日付フィールド>,\<時間フォーマット>)。日付を文字列にフォーマットします。

上記 2 つの関数のフォーマットは Java のフォーマット規則に従います。サポートされるフォーマットタイプは以下のとおりです。

* yyyy：年
* MM：月
* dd：日
* hh：12 時間制（1-12）
* HH：24 時間制（0-23）
* mm：分
* ss：秒

**例 1：**

DATEFORMAT(\<日付フィールド>,"yyyy-MM-dd")。日付フィールドの値が 1989年8月4日 の場合、戻り値は 1989-08-04 です。区切り文字 "-" は "/" などの他の文字に変更することもできます。

**例 2：**

DATEFORMAT(\<日付フィールド>,"yyyy-MM-dd HH:mm:ss")。日付フィールドの値が 2020年9月1日 午後 1 時 30 分 の場合、戻り値は 2020-09-01 13:30:00 です。区切り文字 "-" と ":" は "/"、"年"、"月"、"日"、またはその他の文字に変更することもできます。

### FROMUNIXTIME

**使い方**：数値の Unix タイム値を日付値に変換します。

関数宣言：

```sql theme={"theme":{"light":"github-light","dark":"github-dark"}}
datetime fromunixtime(bigint unixtime)
```

パラメータの説明：

* unixtime：Bigint 型、秒単位、Unix 形式の日付／時刻値。入力が string、double、または decimal 型の場合、計算前に暗黙的に bigint に変換されます。
* 戻り値：Datetime 型の日付値。unixtime が NULL の場合は NULL を返します。

例：

```sql theme={"theme":{"light":"github-light","dark":"github-dark"}}
fromunixtime(123456789) = 1973-11-30 05:33:09
```

### WEEK

**使い方**：WEEK(\[日付], \[開始曜日（任意）])。日付が年の何週目に該当するかを計算します。開始曜日を指定しない場合、週の初日はデフォルトで月曜日となります。開始曜日の値 1〜7 は、それぞれ月曜日から日曜日が週の初日であることを示します。

**例**：WEEK(\[日付],) は、フィールド値が "2020-01-08" の場合、"20202" を返します。開始曜日は任意で、デフォルトは空です。

### QUARTER

**使い方**：QUARTER(\[日付], \[会計年度（任意）])。日付が年の何四半期に該当するかを計算します。会計年度：1 は会計年度統計（4 月開始）、0 は暦年を使用します。

**例**：QUARTER(\[Field1], 0) は、Field1 が "2020-02-02" の場合、"1" を返します。

## 8. 配列

### ArrayToString

**使い方**：ArrayToString(\<配列フィールド>,\[区切り文字（任意）])。配列を文字列に変換します。

**例**：ArrayToString(\<Field1>,\<Field2>) は、Field1 が "\[Product, Engineering, Business]"、Field2 が "-" の場合、"Product-Engineering-Business" を返します。Field2 が空の場合は "Product,Engineering,Business" を返します。結果は以下のとおりです。

### StringToArray

**使い方**：StringToArray(\<文字列>,\[区切り文字（任意）])。文字列を配列に解析します。

**例**：StringToArray(\<Field1>,\<Field2>) は、Field1 が "Product-Engineering-Business"、Field2 が "-" の場合、"\[Product, Engineering, Business]" を返します。

### ArrayLength

**使い方**：ArrayLength(\<配列フィールド>)。配列の長さを返します。

**例**：ArrayLength(\<複数選択またはその他の配列フィールド>) は、フィールドが「部門」で選択肢が "Product, Engineering, Business" の場合、"3" を返します。

### ArrayCat

**使い方**：ArrayCat(\<配列フィールド 1>,\<配列フィールド 2>,...)。複数の配列を連結した結果を返します。

**例**：ArrayCat(\<複数選択またはその他の配列フィールド 1>,\<複数選択またはその他の配列フィールド 2>,...) は、Field1 が "Product, Engineering, Business"、Field2 が "Product staff, Engineering staff, Business staff" の場合、"Product, Engineering, Business, Product staff, Engineering staff, Business staff" を返します。

## 9. 統計

### ROUND

**使い方**：ROUND(\<フィールド>,\<精度>)。フィールドを指定した小数点以下の桁数に丸めます。

**例**：ROUND(\<Field1>,\<精度>)。Field1 が "12.33333" で精度が 2 の場合、戻り値は "12.33" です。

### MOD

**使い方**：MOD(\<フィールド>,\<フィールド>)。剰余（余り）演算です。剰余（余り）の値を返します。

注意：除算の商を得るには、算術演算子 / を使用します。例えば、6/4 は商 1 と余り 2 を返します。

例：MOD(\<Field1>,\<Field2>)。Field1 が "6"、Field2 が "4" の場合、戻り値は "2" です。

### ParseDouble

**使い方**：ParseDouble(\<フィールド>)。文字列または整数を浮動小数点数に変換します。

**例**：ParseDouble(\<フィールド>)。フィールドの値が 3 または "3" の場合、結果は 3.0 です。

### ParseInt

**使い方**：ParseInt(\<フィールド>)。文字列または浮動小数点数を整数に変換します。

**例**：ParseInt(\<フィールド>)。フィールドの値が 3.2 または "3.2" の場合、結果は 3 です。

## 10. FAQ

### レポートで COUNT() を使う方法は？

COUNT はカウントに使用する関数です。詳細については、以下の動画を参照してください。

### レポートに「Formula parsing error. Details: AST syntax error: Unsupported database type encountered during SQL translation: 11」というエラーが表示されるのはなぜですか？

レポート数式フィールドでは、サポート対象の関数のみ使用可能です。サポート対象外の関数を使用するとエラーが発生します。以下のエラースクリーンショットを参照してください。

### コンポーネントが空かどうかをチェックする際、CASEWHEN 関数が機能しません。

数式内で空データをチェックする際は、`Data IS NULL` 構文のみサポートされます。`Data=""` 構文はサポートされません。
