ListAgg 等列选择

时间:2020-12-31 09:59:09

标签: sql oracle

我正在尝试获取以下查询的输出

select 
    listagg((REGEXP_SUBSTR(ABC, '[^:]+$')),';') AS Unit , (select 'XYZ' from dual) 
from 
    MNO 
where
    BATCH in (select BATCH from PQR 
              where TYPE like 'Emp'
                and ORG like 'XYZ')

如果我删除 (select 'XYZ' from dual),它工作正常,但我需要单位和组织信息。

当前查询导致错误

<块引用>

ORA-00937:不是单个组函数

问候

3 个答案:

答案 0 :(得分:1)

不要使用子查询。

select listagg((REGEXP_SUBSTR(ABC, '[^:]+$')),';') AS Unit , 
       'XYZ' 
  from MNO 
 where BATCH in (select BATCH from PQR where TYPE = 'Emp' and ORG = 'XYZ')

答案 1 :(得分:1)

尝试只选择字符串文字 'XYZ' 而不是使用子查询:

SELECT
    LISTAGG(REGEXP_SUBSTR(ABC, '[^:]+$'), ';') AS Unit,
    'XYZ'
FROM MNO m
WHERE EXISTS (SELECT 1 FROM PQR p WHERE p.BATCH = m.BATCH AND
                                        TYPE = 'Emp' AND ORG = 'XYZ');

注意:WHERE 子查询的逻辑不清楚。不清楚您是要在 Emp 列中的任何位置查找 Type 还是要完全匹配。对于后者,请使用 WHERE ... TYPE LIKE '%Emp%',对 ORG 使用类似的方法。

答案 2 :(得分:0)

似乎您需要在包含 join 的 select 语句中对组织进行聚合,例如

SELECT p.org, LISTAGG((REGEXP_SUBSTR(m.abc, '[^:]+$')), ';') AS Unit           
  FROM MNO m
  JOIN PQR p 
    ON m.batch = p.batch
 WHERE p.type LIKE '%Emp%' -- you may replace with 'Emp%' or '%Emp' or 'Emp'
   AND p.org LIKE '%XYZ%' -- you may replace with 'XYZ%' or '%XYZ' or 'XYZ' 
 GROUP BY p.org