2015-07-07 2 views
0

Как преобразовать список из 3 столбцов («x», «y», «value») в матрицу с n строками и n столбцами? (N равно числу count (отдельный x))Как преобразовать список в матрицу в oracle?

что-то вроде это:

|x | y | z| 
-------------- 
|a1 | a2| 3| 
|a1 | a3| 5| 
|a2 | a3| 9| 
|a3 | a3| 0| 
|. | . | .| 
|. | . | .| 
|a5000| a3| 1| 

к ниже:

|x  |a1  |a2 |a3 . . |a5000 
--------------------------------------- 
|a1 |null |3  |5 .. |null 
|a2 |null |null |9 .. |null 
|a3 |null |null |0 .. |null 
|.  | .  | . | .. |. 
|.  | .  | . | .. |. 
|a5000 |null |null |1 .. |null 
  • я не могу использовать стержень, потому что не может написать все значения Y в запросе.
+0

Ммм ... Похоже на это: http://stackoverflow.com/questions/10929108/rotate-pivot-table-with-aggregation-in-oracle – UltraCommit

+0

Я не могу использовать что-то подобное, потому что у меня есть слишком много атрибутов (столбцов). – parvij

ответ

0

Я предполагаю, что вы хотите что-то вроде:

SELECT * 
    FROM (SELECT * FROM YOUR_TABLE) 
    PIVOT (MAX(Z) 
     FOR Y IN ('A1','A2','A3'..., 'A5000')) 
    ORDER BY TO_NUMBER(SUBSTR(X,2)); 

И, как вы говорите, вы не можете писать запрос, потому что есть слишком много значений «А».

Но вы можете написать запрос, который пишет запрос:

SELECT 'SELECT * FROM (SELECT * FROM YOUR_TABLE) PIVOT (MAX(Z) FOR Y IN (' 
    || LISTAGG('''A'||(LEVEL)||'''', ',') WITHIN GROUP (ORDER BY LEVEL) 
    || ')) ORDER BY TO_NUMBER(SUBSTR(X,2))' 
    FROM DUAL 
    CONNECT BY LEVEL <= (SELECT COUNT(DISTINCT X) FROM YOUR_TABLE); 

Этот запрос будет строить запрос, который вы хотите. Затем запустите полученный запрос как любой другой динамический выбор.

+0

Вы правы, но я считаю, что у оракула не может быть больше 1000 столбцов. – parvij

Смежные вопросы