[英]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.