我有這樣一個查詢,回傳下面的資料
select LISTAGG(d. DOCUMENT_TYPE_CD, ',') WITHIN GROUP (ORDER BYD. DOCUMENT_TYPE_CD) as value
from test_table d;
VALUE
---------
CI,ECI,POA
現在我想添加一個條件,只要'ECI'值出現,它就應該在結果中排除'CI',就像下面這個條件一樣
。VALUE>
---------
ECI,POA
我試著在where條件中使用case陳述句,它提示了一個錯誤
。select LISTAGG(d.DOCUMENT_TYPE_CD, ' , ' )
WITHIN GROUP (ORDER BY D. DOCUMENT_TYPE_CD) as value
from test_table d
where CASE d.DOCUMENT_TYPE_CD
WHEN 'ECI' THEN d.DOCUMENT_TYPE_CD<> 'CI'
END;
ORA-00905: missing keyword
00905. 00000 - "缺少關鍵詞"
*原因。
*Action:
錯誤 at行。7 Column: 36
我是否有其他方法可以解決這個問題?
uj5u.com熱心網友回復:
看看這是否有幫助;閱讀代碼中的注釋。
SQL>/span> with
2 test (id, document_type_cd) as
3 -- 樣本資料
4 (select 1, 'ECI' from double union all
5 select 1, 'CI' from double union all
6 select 1, 'POA' from dual union all
7 --
8 select 2, 'CI' from double union all
9 select 2, 'POA' from dual union all.
10 --
11 select 3, 'XYZ' from double union all
12 select 3, 'ABC'/span> from dual
13 )。)
14 temp as
15 --查看每個ID是否存在CI和ECI。
16 (select id,
17 sum(case when document_type_cd= 'CI' then 1 else 0 end) sum_ci,
18 sum(case when document_type_cd = 'ECI' then 1 else 0 end) sum_eci
19 from test
20 group by id
21 )。)
22 excl as
23 --排除CI行,如果該ID存在ECI。
24 (select a.id。
25 a.document_type_cd
26 from test a join temp b on a.id = b.id
27 where a.document_type_cd <>/span> case when b. sum_ci > 0 and b. sum_eci > 0 then 'CI'。
28 else '-1'/span>
29 end
30 )
31 -- 最后:
32 select e.id。
33 listagg(e. document_type_cd, ',') within group (order bye. document_type_cd) result (by e.
34 from excl e
35 group by e.id。
ID RESULT
---------- --------------------
1 ECI,POA
2 CI,POA
3 ABC,XYZ
SQL>/span>
uj5u.com熱心網友回復:
像這樣的:
select LISTAGG(d.DOCUMENT_TYPE_CD, ' , ')
WITHIN GROUP (ORDER BY D. DOCUMENT_TYPE_CD) as value
from test_table d,
(select sum (case when DOCUMENT_TYPE_CD= 'CI' then 1 else 0 end) C
from test_table) A
where d.DOCUMENT_TYPE_CD <> case when A。 c > 0 then 'CI' when A。 c = 0 then ' ' end;
uj5u.com熱心網友回復:
你可以在同一個group by中用兩個條件聚合來識別兩個值的存在,然后在listagg的結果中一次性替換CI。
with a(id, cd) as ( select 1, 'ABC' from dual union all select 1, 'ECI' from dual union all select 1, 'CI' from dual union all select 1, 'POA' from dual union all select 2, 'XYZ' from dual union all select 2, 'ECI' from dual union all select 2, 'CI' from dual union all select 2, 'POA' from dual union all select 3, 'CI' from dual union all select 3, 'POA' from dual union all select 4, 'ABC' from dual union all select 4, 'DEF'/span> from dual ) select id, ltrim( /*添加了逗號,以防CI在開頭*/。 替換( ',' || listagg(cd, ' 。 ') within group (order by cd asc) 。 解碼( /*如果兩者都存在,則替換CI。如果沒有,那么就不要替換任何東西*/。 max(decode(cd, 'CI', 1))*max(decode(cd, 'ECI', 1) )。) 1, ',CI,') ), ',') ), ',') ) as res from a group by idID | RES -: | :---------- 1 | abc,ecci,poa 2 | ECI,PUA,XYZ 3 | CI,POA 4 | ABC,DEF
db<>fiddle here
uj5u.com熱心網友回復:
代替使用GROUP BY,你也可以使用windowing(又稱分析)函式來檢查每組是否存在ECI(測驗資料無恥地從@littlefoot盜用):
with
test (id, document_type_cd) as
--樣本資料。
(select 1, 'ECI' from dual union all)
select 1, 'CI' from dual union all
select 1, 'POA' from dual union all
--
select 2, 'CI' from dual union all
select 2, 'POA' from dual union all
--
select 3, 'XYZ' from dual union all
select 3, 'ABC'/span> from dual
),
temp as
(select id,
檔案_型別_CD。
sum(case when document_type_cd = 'ECI' then 1 else 0 end) over (partition by id) as sum_ci
from test
)
select a.id。
listagg(a. document_type_cd, ',') within group (order by a. document_type_cd) result (by a.
from temp a
where a.document_type_cd ! = 'CI' or sum_eci = 0
group by a.id。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/325013.html
標籤:
上一篇:提取季度-YYYQ1/YYYQ2/YYYQ3/YYYQ4
下一篇:如何區分作業目錄和暫存區?
