我在这个网站上看到很多例子,但我仍然没有任何解决方案。所以我发布了这个问题。
请建议我如何解决这个问题。我正在研究oracle 11gR1版本。
year price Quantity
1991 10 50
2008 20 96
我希望输出为
1991 10
1991 20
2008 50
2008 96
我尝试使用pivot功能但没有实现并因为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 :(得分:3)
您似乎需要UNPIVOT
而非枢轴。 unpivot是将多行转换为多列的过程。
由于您使用的是Oracle 11g,因此可以使用unpivot函数:
select year, value
from my_table
unpivot
(
value
for col in (price, quantity)
) u
您也可以使用UNION ALL
:
select year, price as value
from my_table
union all
select year, quantity as value
from my_table
基于您还希望在最终结果中包含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;
答案 1 :(得分: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