繁体   English   中英

在Oracle中将行值转换为列标题

[英]Row Values into Column Headers in Oracle

我有一个特定的用例,其中行值需要动态转换为视图列标题。 之所以需要视图,是因为列名取决于可以随时更改的输入表的行值。

输入:表

Item   Class   Attribute  Attribute_Val
------ ------- ---------- -------------
Apple  Fruit   Name       Gala 
Apple  Fruit   Color      Red 
Apple  Fruit   Origin     USA
Apple  Fruit   Price      3 
Mango  Fruit   Name       Alphonso
Mango  Fruit   Color      Yellow 
Mango  Fruit   Origin     MEX, IND
Mango  Fruit   Price      5

预期输出:从数据库视图

Item   Class   Name     Color  Origin  Price
------ ------- -----    ------ ------  -----
Apple  Fruit   Gala     Red    USA     3
Mango  Fruit   Alphonso Yellow MEX,IND 5

假设明天为类“水果”添加了一个新的属性(季节)。 这将在输入表中产生2行(Apple和Mango项各一个),该视图应能够在其输出中动态添加新列“ Season”。

通过Oracle视图或函数可以完成此操作吗?

使用PIVOT

SQL小提琴

Oracle 11g R2架构设置

CREATE TABLE table_name ( Item, Class, Attribute, Attribute_Val ) AS
SELECT 'Apple', 'Fruit', 'Name',   'Gala'     FROM DUAL UNION ALL
SELECT 'Apple', 'Fruit', 'Color',  'Red'      FROM DUAL UNION ALL
SELECT 'Apple', 'Fruit', 'Origin', 'USA'      FROM DUAL UNION ALL
SELECT 'Apple', 'Fruit', 'Price',  '3'        FROM DUAL UNION ALL
SELECT 'Mango', 'Fruit', 'Name',   'Alphonso' FROM DUAL UNION ALL
SELECT 'Mango', 'Fruit', 'Color',  'Yellow'   FROM DUAL UNION ALL
SELECT 'Mango', 'Fruit', 'Origin', 'MEX, IND' FROM DUAL UNION ALL
SELECT 'Mango', 'Fruit', 'Price',  '5'        FROM DUAL;

查询1

SELECT *
FROM   table_name
PIVOT ( MAX( Attribute_Val ) FOR Attribute IN (
  'Name'   AS name,
  'Color'  AS color,
  'Origin' AS origin,
  'Price'  AS price
) )

结果

|  ITEM | CLASS |     NAME |  COLOR |   ORIGIN | PRICE |
|-------|-------|----------|--------|----------|-------|
| Mango | Fruit | Alphonso | Yellow | MEX, IND |     5 |
| Apple | Fruit |     Gala |    Red |      USA |     3 |

假设明天为类“水果”添加了一个新的属性(季节)。 这将在输入表中产生2行(Apple和Mango项各一个),该视图应能够在其输出中动态添加新列“ Season”。

不,这是不可能的。 视图在编译时确定有固定数量的列,并且将数据(或列)添加到父表不会更新该视图。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM