Reputation: 377
I have procedure, which have one input parameter. I'm using this parameter to filter result table of query.
procedure gettabledata(level in number, cur out sys_refcursor) is
begin
open cur for
with data as (
select 'a' as field1, 'b' as field2, 'c' as field3, 'd' as field4, 10 as val from dual
union all
select 'a' as field1, 'b' as field2, 'd' as field3, 'c' as field4, 11 as val from dual
union all
select 'a' as field1, 'c' as field2, 'b' as field3, 'd' as field4, 12 as val from dual
union all
select 'a' as field1, 'c' as field2, 'd' as field3, 'b' as field4, 13 as val from dual
union all
select 'a' as field1, 'd' as field2, 'b' as field3, 'c' as field4, 14 as val from dual
union all
select 'a' as field1, 'd' as field2, 'c' as field3, 'b' as field4, 15 as val from dual
)
select null, null, null, field4, sum(val) from data where level = 1 group by field4
union all
select null, null, field3, field4, sum(val) from data where level = 2 group by field4, field3
union all
select null, field2, field3, field4, sum(val) from data where level = 3 group by field4, field3, field2
union all
select field1, field2, field3, field4, sum(val) from data where level = 4 group by field4, field3, field2, field1;
end;
It works fine, but I have a questiton. Are there any ways to filter result table with using case when else
statement or do not use union
statement?
Upvotes: 0
Views: 34
Reputation: 35900
Yes. You can use case when
as following:
select case when level = 4 then field1 end,
Case when level >= 3 then field2 end,
case when level >= 2 then field3 end,
field4, sum(val) from data
group by
field4,
case when level >= 2 then field3 end,
Case when level >= 3 then field2 end
case when level = 4 then field1 end;
Cheers!!
Upvotes: 1