繁体   English   中英

SQL:基于行值动态重命名列

[英]SQL: Dynamic renaming of columns based on row values

考虑到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.

有没有办法动态命名列?

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

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

您正在体验拥有EAV数据模型的不利方面。

您希望将动态sql语句执行到SYS_REFCURSOR中

但是,你造成了相当大的开销,因为

  1. 你必须执行两次查询(第一次构建动态SQL,第二次检索结果)
  2. 你需要更多的解析而不是必要的

暂无
暂无

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

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