[英]Getting not a group by expression while using listagg function
CREATE TABLE source_det (
e_id NUMBER(10),
sys_name VARCHAR2(20),
ref_id NUMBER(10),
sys_other VARCHAR2(30)
);
INSERT INTO source_det VALUES(11,'SOURCE',992,null);
INSERT INTO source_det VALUES(11,'SOURCE',637,null);
INSERT INTO source_det VALUES(11,'SOURCE',null,'Manual');
INSERT INTO source_det VALUES(11,'TARGET',637,null);
commit;
我的尝试:
SELECT e_id,
LISTAGG(source, ';') source,
LISTAGG(target, ';') target,
source_other
FROM (SELECT e_id,
CASE
WHEN sys_name = 'SOURCE' THEN
ref_id
END source,
CASE
WHEN sys_name = 'TARGET' THEN
ref_id
END target,
CASE
WHEN sys_name = 'SOURCE' AND ref_id IS NULL THEN
sys_other
END source_other
FROM source_det
GROUP BY e_id);
从上面的数据集中,我只需要从SELECT
查询返回一行,但我得到的是null
值以及所需的值。 如果sys_name
是 SOURCE 那么结果应该是ref_id
。 如果有多个记录,则应使用定界符将其拆分; 如果sys_name
是 TARGET 那么结果应该是ref_id
如果sys_name
是 SOURCE AND ref_id
是 null 那么它应该给sys_other
作为结果。 但是从我的查询中我没有得到一行而是得到 4 行。 但理想情况下,我只需要一行e_id
11 最重要的是代替 null 值,可能会有()
代替 null。因此,也需要排除这一点。 获得所需结果后,我们可以像这样使用 DECODE(ref_id,'()',null) 。
预期结果:
e_id | 来源 | 目标 | 来源_其他 |
---|---|---|---|
11 | 992;637 | 637 | 手动的 |
使用的工具:SQL Developer (18c)
您不需要子查询,只需像下面这样使用
SELECT e_id,
LISTAGG(CASE
WHEN sys_name = 'SOURCE' THEN
ref_id
END,
';') WITHIN GROUP(ORDER BY ref_id DESC) AS source,
LISTAGG(CASE
WHEN sys_name = 'TARGET' THEN
ref_id
END,
';') WITHIN GROUP(ORDER BY ref_id DESC) AS target,
LISTAGG(CASE
WHEN sys_name = 'SOURCE' AND ref_id IS NULL THEN
DECODE(sys_other,'()','',sys_other)
END,
';') WITHIN GROUP(ORDER BY 0) AS source_other
FROM source_det
GROUP BY e_id
其中缺少WITHIN GROUP (ORDER BY..)
应该遵循LISTAGG(...)
表达式
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.