ORA-01467: sort key to long

rolling_kz
Дата: 31.05.2006 09:46:40
предистория:

вопрос:
rolling_kz
есть такая таблица

the_table
id  |  name |amount | ins_date
1    vasya    13     01.01.2006
2    kolya     25     15.01.2006
3    vasya    44     20.01.2006
4    vasya    10     01.02.2006
5    kolya     25     01.02.2006    

нужно получить

name | 01.01.2006 | 15.01.2006 | 20.01.2006 | 01.02.2006
vasya     13                     44                 10
kolya                    25                          25  


ответ:
Владимор Конев

Транспонирование строк в столбцы
Транспонирование строк в столбцы в реф-курсоре


Это помогло, но теперь на некоторых запросах дает ошибку при ORA-01467: sort key to long при большои кол-ве столбцов.

Почитал в сети и не нашел ответа, может кто знает как выкрутиться, т.е. получить много столбцов через decode с группировкой?
dmidek
Дата: 31.05.2006 11:17:08
Какая длина поля name ?
orawish
Дата: 31.05.2006 11:18:00
Лично я решаю подобные задачи так:
create table a_table
as select 1 id,'vasya' name,    13 amount,    to_date('01.01.2006') ins_date from dual
union select 2,    'kolya',     25,  to_date('15.01.2006') from dual
union select 3,    'vasya',     44,  to_date('20.01.2006') from dual
union select 4,    'vasya',     10,  to_date('01.02.2006') from dual
union select 5,    'kolya',     25,  to_date('01.02.2006') from dual;

select
 a#1
,NAME y#a1
,y#g1
,y#1
,max(y#1) over() y#m
,INS_DATE x#a1
,x#g1
,x#1
,max(x#1) over() x#m
 from (
select
 sum(AMOUNT) a#1
,grouping(NAME) y#g1
,NAME
,dense_rank() over (order by grouping(NAME),NAME) y#1
,grouping(INS_DATE) x#g1
,INS_DATE
,dense_rank() over (order by grouping(INS_DATE),INS_DATE) x#1
 from (
--->>
select ID,NAME,AMOUNT,INS_DATE from CDH_HB.A_TABLE
) group by grouping sets(
 (NAME,INS_DATE)
,(INS_DATE)
,(NAME)
,())
) order by y#1 ,x#1;
Посмотрите на результат запроса. Он несет в каждой строке информацию
о размерности матрицы результатов и информацию об одной ячейке результирующего грида, включая и содержимое заголовков столбцов и заголовков строк всех уровней (в данном, простейшем, примере - один уровень группировки по столбцам и один по колонкам.
Остается - только разрисовать тот грид, но это уже - (элементарная) задача других средств .. изобразительных.. Типа:
rolling_kz
Дата: 31.05.2006 11:59:03
dmidek
Какая длина поля name ?

- int(16) а пример упрощен


orawish
Лично я решаю подобные задачи так:

нехило, но пока не понятно, вот из исходной получили

   	A#1	Y#A1	Y#G1	Y#1	Y#M	X#A1	X#G1	X#1	X#M
1 25 kolya 0 1 3 15.01.2006 0 2 5
2 25 kolya 0 1 3 01.02.2006 0 4 5
3 50 kolya 0 1 3 1 5 5
4 13 vasya 0 2 3 01.01.2006 0 1 5
5 44 vasya 0 2 3 20.01.2006 0 3 5
6 10 vasya 0 2 3 01.02.2006 0 4 5
7 67 vasya 0 2 3 1 5 5
8 13 1 3 3 01.01.2006 0 1 5
9 25 1 3 3 15.01.2006 0 2 5
10 44 1 3 3 20.01.2006 0 3 5
11 35 1 3 3 01.02.2006 0 4 5
12 117 1 3 3 1 5 5

да без пузыря не разберешся,
поясни плиз смысл подхода
dmidek
Дата: 31.05.2006 12:02:13
rolling_kz
dmidek
Какая длина поля name ?

- int(16) а пример упрощен



Покажите тогда нормальный пример
rolling_kz
Дата: 31.05.2006 12:21:28
dmidek
rolling_kz
dmidek
Какая длина поля name ?

- int(16) а пример упрощен



Покажите тогда нормальный пример

этот пример нормален, и тут длина поля почти не причем, так как при возрастании количества столбцов (дат) наступает "ORA-01467: sort key to long"
то есть метод указанный в ссылках не универсален в принципе.
orawish
Дата: 31.05.2006 12:47:15
rolling_kz
..поясни плиз смысл подхода

Поясняю
       A#1 Y#A1        Y#G1        Y#1        Y#M X#A1           X#G1        X#1        X#M
---------- ----- ---------- ---------- ---------- -------- ---------- ---------- ----------
        25 kolya          0          1          3 15.01.06          0          2          5
        25 kolya          0          1          3 01.02.06          0          4          5
        50 kolya          0          1          3                   1          5          5
        13 vasya          0          2          3 01.01.06          0          1          5
        44 vasya          0          2          3 20.01.06          0          3          5
        10 vasya          0          2          3 01.02.06          0          4          5
        67 vasya          0          2          3                   1          5          5
        13                1          3          3 01.01.06          0          1          5
        25                1          3          3 15.01.06          0          2          5
        44                1          3          3 20.01.06          0          3          5
        35                1          3          3 01.02.06          0          4          5
       117                1          3          3                   1          5          5
После первого фетча - известен полный размер матрицы X#M,Y#M (тут- 3x5)
Координаты каждой (непустой) ячейки - Y#1 и X#1,значение ячейки- A#1.
Y#G1 и X#G1 - признак, показывающий, есть ли это итог (по данной оси и группировке).Ну и Y#A1,X#A1 - значения, по которым проводилась группировка (денормализованные - встечаются столько раз, сколько непустых значений есть в соответствующем столбце/строке результата и место их в титульном столбце/титульной строке)