【问题标题】:Converting columns to rows in oracle 11gR1在 oracle 11gR1 中将列转换为行
【发布时间】:2014-09-05 11:14:34
【问题描述】:

我在这个网站上看到了很多例子,但我仍然没有得到任何解决方案。所以我发布了这个问题。
请建议我如何解决此问题。我正在开发 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 的产品名称,我正在获取并且我在上述查询中传递该列,如下所示。

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

得到错误

ORA-01790:表达式必须与对应的表达式具有相同的数据类型

请@BlueFeet 对此提出建议。

【问题讨论】:

  • ORA-01790 错误是不言自明的错误,你不这么认为吗?

标签: sql oracle11g unpivot


【解决方案1】:

看来您需要UNPIVOT 而不是pivot。 unpivot是将多行转换为多列的过程。

由于您使用的是 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

【讨论】:

    【解决方案2】:

    试试这个:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-12
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多