2015-01-20 2 views
2

У меня есть таблица вроде этого:Преобразование столбца в строки в Oracle 11g

+----+----------+----------+----------+-----------+----------+----------+ 
| ID | AR_SCORE | ER_SCORE | FS_SCORE | CPF_SCORE | IF_SCORE | IS_SCORE | 
+----+----------+----------+----------+-----------+----------+----------+ 
| 1 |  25 |  35 |  45 |  55 |  65 |  75 | 
| 2 |  95 |  85 |  75 |  65 |  55 |  45 | 
+----+----------+----------+----------+-----------+----------+----------+ 

И мне нужно, чтобы извлечь это:

+----+----------+-------+ 
| ID | SCORE | VALUE | 
+----+----------+-------+ 
| 1 | AR_SCORE | 25 | 
| 1 | ER_SCORE | 35 | 
| 2 | AR_SCORE | 95 | 
+----+----------+-------+ 

Я прочитал много вопросов о том, как использовать поворотное в оракула, но Я не мог заставить его работать.

ответ

3

Преобразование из столбцов в строки на самом деле является UNPIVOT. Поскольку вы используете Oracle 11g, есть несколько способов получить результат.

Первый способ будет использовать комбинацию из SELECT yourcolumn FROM...UNION ALL:

select ID, 'AR_SCORE' as Score, AR_SCORE as value 
from yourtable 
union all 
select ID, 'ER_SCORE' as Score, ER_SCORE as value 
from yourtable 
union all 
select ID, 'FS_SCORE' as Score, FS_SCORE as value 
from yourtable 
union all 
select ID, 'IF_SCORE' as Score, IF_SCORE as value 
from yourtable 
union all 
select ID, 'IS_SCORE' as Score, IS_SCORE as value 
from yourtable 
order by id 

См Demo. Использование UNION ALL состояло в том, как вам нужно было отключить данные до Oracle 11g, но начиная с этой версии была реализована функция UNPIVOT. Это позволит получить тот же результат с меньшим количеством строк кода:

select ID, Score, value 
from yourtable 
unpivot 
(
    value 
    for Score in (AR_SCORE, ER_SCORE, FS_SCORE, IF_SCORE, IS_SCORE) 
) un 
order by id 

См Demo. Оба даст результат:

| ID | SCORE | VALUE | 
|----|----------|-------| 
| 1 | AR_SCORE | 25 | 
| 1 | FS_SCORE | 45 | 
| 1 | IS_SCORE | 75 | 
| 1 | IF_SCORE | 65 | 
| 1 | ER_SCORE | 35 | 
| 2 | FS_SCORE | 75 | 
| 2 | IS_SCORE | 45 | 
| 2 | ER_SCORE | 85 | 
| 2 | IF_SCORE | 55 | 
| 2 | AR_SCORE | 95 | 
+0

Действительно хорошо. Я использую второй способ. и я вижу, что автоматически не выбирает нулевые значения, которые являются хорошими. Но если в будущем мне нужно будет иметь нулевые значения, есть ли способ? – AndreA

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