考虑Oracle 10g
,有没有办法根据指定的行重命名列?
首先让我给出一个背景资料。要求是将行转动并将它们转换为列。由于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.
有没有办法动态命名列?
答案 0 :(得分:2)
列名称类似于变量名称 - 它是可以在程序中使用的标识符。它的名称动态变化没有多大意义。
目前为每个属性设置不同列的策略是可以的,IMO。
您正在遇到拥有EAV数据模型的缺点。
答案 1 :(得分:1)
您想要execute a dynamic sql statement into a SYS_REFCURSOR
但是,你造成了相当大的开销,因为