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. 如果有多個記錄,則應使用 delimiter 分隔;If sys_nameis TARGET 那么結果應該是ref_id
If sys_nameis SOURCE AND ref_idis null 那么它應該給出sys_other結果。但從我的查詢中,我沒有得到單行而是得到 4 行。但理想情況下,我只需要一行e_id11 最重要的是代替空值,可能會有()代替 null 出現。所以,也需要排除這個。得到想要的結果后,我們可以像這樣使用 DECODE(ref_id,'()',null) 。
預期結果:
| e_id | 資源 | 目標 | source_other |
|---|---|---|---|
| 11 | 992;637 | 637 | 手動的 |
使用的工具:SQL Developer (18c)
uj5u.com熱心網友回復:
您不需要子查詢,只需像下面這樣使用
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(...)運算式后面
Demo
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/448756.html
