2012-04-01 34 views
1

考虑到Oracle 10g,有没有办法根据指定行重命名列?SQL:根据行值对列进行动态重命名

让我先给一个背景。要求是对行进行旋转并将它们转换为列。由于Oracle 10g不支持PIVOT功能,因此我们已经完成了使用max and case关键字的工作。

现在的问题是这样的。有没有基于两行重新命名列的方法? 考虑见下表:

BRAND | MODEL | COMPONENT_NAME | COMPONENT_VALUE | ATTRIBUTE_NAME | ATTRIBUTE_VALUE 
----------------------------------------------------------------------------------- 
SAMSUNG | I9100 | Chipset  | Exynos   | frequency  | 1200  
SAMSUNG | I9100 | Screen   | Amoled   | colors   | 16M 
SAMSUNG | I9100G | Chipset  | TI OMAP4430  | frequency  | 1200  
SAMSUNG | I9100G | Screen   | Amoled   | colors   | 16M 
------------------------------------------------------------------------------------ 

我们希望这样的:与上面的COMPONENT_NAME转化为`column header for one and the COMPONENT_NAME - ATTRIBUTE_NAME`作为另一个。

BRAND | MODEL | Chipset  | Chipset - frequency | Screen | Screen - colors 
------------------------------------------------------------------------ 
SAMSUNG | I9100 | Exynos  | 1200    | Amoled | 16M   
SAMSUNG | I9100G | TI OMAP4430 | 1200    | Amoled | 16M 
------------------------------------------------------------------------ 

目前我们下面来产生第二个表:

SELECT DISTINCT BRAND, MODEL, 
MAX(CASE WHEN (COMPONENT_NAME = 'Chipset') THEN 
COMPONENT_VALUE 
END) AS "Chipset", 
MAX(CASE WHEN (COMPONENT_NAME = 'Chipset' and ATTRIBUTE_NAME = 'frequency') THEN 
ATTRIBUTE_VALUE 
END) AS "Screen", 
MAX(CASE WHEN (COMPONENT_NAME = 'Screen') THEN 
COMPONENT_VALUE 
END) AS "Screen", 
MAX(CASE WHEN (COMPONENT_NAME = 'Screen' and ATTRIBUTE_NAME = 'colors') THEN 
ATTRIBUTE_VALUE 
END) AS "Screen - colors" from table....etc. 

有没有办法来动态name列?

+0

@GauravSoni,如果你不喜欢我的编辑,你应该已经推出它背部。因为您刚刚重新介绍了语法错误和不必要的内嵌标签,并删除了有用的标签? – Ben 2012-04-01 13:26:43

+0

@ben:对不起,实际上没有看到你的编辑部分,可能是当我编辑你已经承诺你的编辑。你可以恢复我的变化。再次抱歉。 – 2012-04-01 13:45:20

回答

2

列名称类似于变量名称 - 它是可以在程序中使用的标识符。它的名字动态变化没有多大意义。

您目前的策略是为每个属性设置不同的列,IMO。

您正在经历一个使用EAV数据模型的缺点。

+0

我们结束了同样的事情。尽管由于oracle的最大列名限制,我们为某些列创建了一个简短的别名,并在这些列被显示在前端之前重命名这些列 – RavenXV 2012-08-13 00:12:09