説明
この関数は列を行に変換するために使用されます。LISTAGG は ORDER BY 句で指定された各グループ内のデータをソートし、次にメジャー列の値を集計します。集計または分析関数として使用できます。
説明
- 分析関数として使用する場合、
OVER句を使用してウィンドウを定義して計算を行う必要があります。この関数は、query_partition_clause内の1つ以上の式に基づいてクエリ結果セットをいくつかのグループに分割します。 - 集計関数として使用する場合、
OVERキーワードを追加する必要はありません。- 単一の集合としての集計関数として、
LISTAGGはすべての行に対して操作を実行し、単一の出力行を返します。 - グループ集計として、
LISTAGGはGROUP BY句で定義された各グループに対して操作を実行し、出力行を返します。
- 単一の集合としての集計関数として、
構文
LISTAGG (measure_expr [,'delimiter']) [ WITHIN GROUP ] (order_by_clause)
[ OVER query_partition_clause ]
パラメータの説明
| パラメータ | 説明 |
|---|---|
| measure_expr | 任意の式を指定できます。測定列のNULL値は無視されます。 |
| delimiter | 測定値を区切るために使用する文字列を指定します。この句はオプションで、デフォルトはNULLです。 |
| OVER | OVER句を使用してウィンドウを定義し、計算を行います。詳細については、分析関数の説明を参照してください。 |
返り値の型
測定列がRAWの場合、返されるデータ型はRAWとなります。それ以外の場合、返り値はVARCHAR2となります。
例
既に作成されたテーブルemployeesがあります。
obclient> SELECT * FROM employees;
+---------------+------------+-----------+------------+--------+
| DEPARTMENT_ID | MANAGER_ID | LAST_NAME | HIREDATE | SALARY |
+---------------+------------+-----------+------------+--------+
| 30 | 100 | Raphaely | 2017-07-01 | 1700 |
| 30 | 100 | De Haan | 2018-05-01 | 11000 |
| 40 | 100 | Errazuriz | 2017-07-21 | 1400 |
| 50 | 100 | Hartstein | 2019-10-05 | 14000 |
| 50 | 100 | Raphaely | 2017-07-22 | 1700 |
| 50 | 100 | Weiss | 2019-10-05 | 13500 |
| 90 | 100 | Russell | 2019-07-11 | 13000 |
| 90 | 100 | Partners | 2018-12-01 | 14000 |
+---------------+------------+-----------+------------+--------+
8 rows in set
集計関数の例
第30部門の全従業員を照会し、雇用日と姓でソートします。
obclient> SELECT LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hiredate, last_name) as "Emp_list",
MIN(hiredate) as "Earliest"
FROM employees
WHERE department_id = 30;
+-------------------+------------+
| Emp_list | Earliest |
+-------------------+------------+
| Raphaely; De Haan | 2017-07-01 |
+-------------------+------------+
1 row in set
分析関数の例
2019年10月10日以前に雇用された従業員の情報を照会します。これには、その従業員の部門、雇用日、およびその部門の他の従業員が含まれます。
obclient> SELECT department_id "Dept",hiredate "Date",last_name "Name",
LISTAGG(last_name, '; ') WITHIN GROUP (ORDER BY hiredate, last_name) OVER (PARTITION BY department_id) as "Emp_list"
FROM employees
WHERE hiredate < '2019-10-10'
ORDER BY "Dept", "Date", "Name";
+------+------------+-----------+----------------------------+
| Dept | Date | Name | Emp_list |
+------+------------+-----------+----------------------------+
| 30 | 2017-07-01 | Raphaely | Raphaely; De Haan |
| 30 | 2018-05-01 | De Haan | Raphaely; De Haan |
| 40 | 2017-07-21 | Errazuriz | Errazuriz |
| 50 | 2017-07-22 | Raphaely | Raphaely; Hartstein; Weiss |
| 50 | 2019-10-05 | Hartstein | Raphaely; Hartstein; Weiss |
| 50 | 2019-10-05 | Weiss | Raphaely; Hartstein; Weiss |
| 90 | 2018-12-01 | Partners | Partners; Russell |
| 90 | 2019-07-11 | Russell | Partners; Russell |
+------+------------+-----------+----------------------------+
8 rows in set