I am trying to use listagg but I’m getting the wrong output. Normally, I would use each case statement separately, but then how would I use listagg?
Table A:
x
JAN FEB MAR APR Tag
C 102
D T 100
D 101
C D B T 103
Table B:
Name Tag
Ally 100
Ben 101
Missy 102
Noah 103
Desired Output:
Ally Dog,Turtle
Ben Dog
Missy Chicken
Noah Chicken,Dog,Bird,Turtle
My attempted (wrong) code:
select listagg(
nvl(
case when a.jan = 'C' then 'Chicken'
when a.feb = 'D' then 'Dog'
when a.mar = 'B' then 'Bird'
when a.apr = 'T' then 'Turtle'
end,','),'none')
within group (order by a.tag)
from a where a.tag = b.tag
Advertisement
Answer
Here’s one option, which uses multiple self-joins.
- lines #1 – 14 represent your sample data
anima
CTE is here to simplify code; better have it in a table (even if it is a CTE) than useCASE
- the final result, lines #24 – 34, concatenates animal names
trim
+regexp_replace
is used to remove superfluous commas
Here you go:
SQL> with
2 -- sample data
3 taba (jan, feb, mar, apr, tag) as
4 (select 'c' , null, null, null, 102 from dual union all
5 select null, 'd' , null, 't' , 100 from dual union all
6 select null, 'd' , null, null, 101 from dual union all
7 select 'c' , 'd' , 'b' , 't' , 103 from dual
8 ),
9 tabb (name, tag) as
10 (select 'ally' , 100 from dual union all
11 select 'ben' , 101 from dual union all
12 select 'missy', 102 from dual union all
13 select 'noah' , 103 from dual
14 ),
15 --
16 -- replace animal codes with their names
17 anima (code, name) as
18 (select 'c', 'chicken' from dual union all
19 select 'd', 'dog' from dual union all
20 select 'b', 'bird' from dual union all
21 select 't', 'turtle' from dual
22 )
23 -- the final result
24 select b.name,
25 trim(',' from regexp_replace(n1.name ||','|| n2.name ||','|| n3.name ||','|| n4.name,
26 '( *, *){2,}', ','
27 )
28 ) result
29 from tabb b join taba a on a.tag = b.tag
30 left join anima n1 on n1.code = a.jan
31 left join anima n2 on n2.code = a.feb
32 left join anima n3 on n3.code = a.mar
33 left join anima n4 on n4.code = a.apr
34 order by b.name;
NAME RESULT
----- ------------------------------
ally dog,turtle
ben dog
missy chicken
noah chicken,dog,bird,turtle
SQL>