2012-04-01 96 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