2014-09-05 3 views
1

Я видел там много примеров на этом сайте, но все же у меня нет никакого решения. Так что я отправляю вопрос.
Пожалуйста, предложите мне, как я могу решить эту проблему. Iam, работающий на оракуле 11gR1 версия.Преобразование столбцов в строки в oracle 11gR1

year   price  Quantity 
1991   10  50 
2008   20  96 

Я хочу выход как

1991 10 
1991 20 
2008 50 
2008 96 

Я попытался с функцией поворота, но не достигается и получать исключение как команда SQL должным образом не прекращается.
ниже - мой запрос. Я не очень хорош в sql.

select * from (select year, price ,quanty from my_table) 
     pivot(min(year) year in (price, quanty)); 

РЕДАКТИР выше вопрос:

select year, value 
from my_table 
unpivot 
(
    value 
    for col in (price, quantity) 
) u 

Для приведенного выше запроса, если у меня есть еще один столбец по имени продукта, который является VARCHAR, IAM получать и я передать колонку в выше как показано ниже.

select year, value 
    from my_table 
    unpivot 
    (
     value 
     for col in (price, quantity,productname) 
    ) u 

получать ошибки, как

ORA-01790: выражение должно иметь тот же тип данных, как соответствующее выражение

Пожалуйста @BlueFeet предложить на этом.

+0

ор-01790 ошибки сама за себя ошибку, вы так не думаете? – zaratustra

ответ

3

похоже, что вам нужно UNPIVOT вместо pivot. Неповтор - это процесс преобразования нескольких строк в несколько столбцов.

Поскольку вы используете Oracle 11g, вы можете использовать функцию UNPIVOT:

select year, value 
from my_table 
unpivot 
(
    value 
    for col in (price, quantity) 
) u 

См SQL Fiddle with Demo.

Вы также могли бы написать это с помощью UNION ALL:

select year, price as value 
from my_table 
union all 
select year, quantity as value 
from my_table 

См SQL Fiddle with Demo

Исходя из того, что вы хотите включить varchar столбец в конечном итоге, вам нужно преобразовать столбцы всем быть один и тот же тип данных - вы можете сделать это в подзапрос:

select year, value 
from 
(
    select year, 
    to_char(price) as price, 
    to_char(quantity) as quantity, 
    productname 
    from my_table 
) 
unpivot 
(
    value 
    for col in (price, quantity, productname) 
) u; 

См SQL Fiddle with Demo

1

Попробуйте это:

with t(year, price, Quantity) as(
    select 1991, 10, 50 from dual union all 
    select 2008, 20, 96 from dual 
) 
select year, new_col1 
    from t 
unpivot (
    new_col1 for new_col in (price, quantity)) 

YEAR NEW_COL1 
---------------- 
1991 10 
1991 50 
2008 20 
2008 96 

Подробнее here