簡體   English   中英

使用 listagg 時不按表達式分組 function

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM