簡體   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