这是我的代码:
SELECT rule,
DATASET,
type,
LISTAGG(source,';') within GROUP (ORDER BY source) AS source,
TARGET,
LISTAGG(filter,';') within GROUP (ORDER BY filter) AS filter
FROM demo_table;
Run Code Online (Sandbox Code Playgroud)
我的问题是使用的两个listagg()。如果有两个来源和一个过滤器,则给出重复的过滤器,反之亦然。我可以添加什么以仅具有确切数目的源和过滤器?
首先选择所需的DISTINCT值,然后将LISTAGG应用于它们。这是一个基于Scott模式的示例。
SQL> -- Duplicate jobs within the department
SQL> select deptno, listagg(job, ', ') within group (order by job) jobs
2 from emp
3 group by deptno;
DEPTNO JOBS
---------- ------------------------------------------------------------
10 CLERK, MANAGER, PRESIDENT
20 ANALYST, ANALYST, CLERK, CLERK, MANAGER
30 CLERK, MANAGER, SALESMAN, SALESMAN, SALESMAN, SALESMAN
SQL>
SQL> -- This won't work - DISTINCT can't be used in LISTAGG
SQL> select deptno, listagg(distinct job, ', ') within group (order by job) jobs
2 from emp
3 group by deptno;
select deptno, listagg(distinct job, ', ') within group (order by job) jobs
*
ERROR at line 1:
ORA-30482: DISTINCT option not allowed for this function
SQL>
SQL> -- So - select distinct jobs first, then apply LISTAGG to it
SQL> select x.deptno, listagg(x.job, ', ') within group (order by x.job) jobs
2 from (select distinct deptno, job
3 from emp) x
4 group by x.deptno;
DEPTNO JOBS
---------- ------------------------------------------------------------
10 CLERK, MANAGER, PRESIDENT
20 ANALYST, CLERK, MANAGER
30 CLERK, MANAGER, SALESMAN
SQL>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4073 次 |
| 最近记录: |