group & case

gcase
Дата: 17.09.2015 12:42:03
Приветы!

Имеем табл.
idnameval
1 n1 12
2 n2 12
3 n3 13
1 n1 15
5 n5 10
3 n3 5
2 n2 22
2 n2 25
1 n1 24


Получ. данные запросом
with t(id,name,val) as 
(select 1,'n1',12 from dual union all
select 2,'n2',12 from dual union all
select 3,'n3',13 from dual union all
select 1,'n1',15 from dual union all
select 5,'n5',10 from dual union all
select 3,'n3',5 from dual union all
select 2,'n2',22 from dual union all
select 2,'n2',25 from dual union all
select 1,'n1',24 from dual
)
select  id,name
        ,max(case when rn=1 then val else null end) v1
        ,max(case when rn=2 then val else null end) v2
        ,max(case when rn=3 then val else null end) v3
from (
select id,name,val,row_number() over(partition by id order by val) rn 
from t) 
group by id,name 
order by 3 

idnamev1v2v3
3 n3 5 13
5 n5 10
1 n1 12 15 24
2 n2 12 22 25

Интересует альтернативное решение, чтобы не писать для каждого (возможного) case ?
Elic
Дата: 17.09.2015 12:51:54
gcase
Дата: 17.09.2015 13:13:41
Elic,

В in также придётся перечислять все возможные знач.
pivot (max(val) for rn in (1 v1,2 v2,3 v3))
?
Elic
Дата: 17.09.2015 13:29:24
gcase
В in также придётся перечислять все возможные знач.
Это же короче, чем case-ы? :)
По-другому не бывает. STFF pivot xml
gcase
Дата: 17.09.2015 13:46:50
Elic,

"Короче" не интересно ) тем более pivot на больших данных имхо будет медленнее case ..
Elic
Дата: 17.09.2015 13:53:21
gcase
"Короче" не интересно ) тем более pivot на больших данных имхо будет медленнее case ..
Флаг в руки ...
ArtNick
Дата: 17.09.2015 13:59:13
gcase
Интересует альтернативное решение, чтобы не писать для каждого (возможного) case ?

Ответ на твой вопрос в этой теме, ничего нового пока не придумали- либо вменяемый отчетник либо динскл
JDS
Дата: 17.09.2015 15:41:40
Может попробовать в эту сторону попилить (name убрал пока)?
+
with t as (select 1 id, 12 val from dual union all
           select 2, 12 from dual union all
           select 3, 13 from dual union all
           select 1, 15 from dual union all
           select 5, 10 from dual union all
           select 3, 5 from dual union all
           select 2, 22 from dual union all
           select 2, 25 from dual union all
           select 1, 24 from dual)
select id, listagg(max_val, '/ ') within group(order by rn) list_max_val
from
  (select id, 
         rn,
         max(val) max_val
   from (select id, val, row_number() over(partition by id order by val) rn 
           from t)
group by id, rn)
group by id
order by 1

Остается нарыть вариант разбивки строки с разделителями list_max_val на поля v1, v2 и т.д. ну и с сортировкой допилить, если надо? Зато не надо писать кейсы, а может в строке все и оставить? )
ArtNick
Дата: 17.09.2015 15:53:52
JDS,
Воспитанные люди для этих целей платок XML используют :)