2012-04-01 16 views
1

Oracle 10gを考慮すると、指定された行に基づいて列の名前を変更する方法はありますか?SQL:行の値に基づいた列の動的な名前変更

まず背景を教えてください。必要条件は、行をピボットして列にすることでした。 Oracleの10gは、関数PIVOTをサポートしていないので、我々はmax and caseキーワードを使用して周りに仕事をしてきました。

さて問題は、このです。 2つの行に基づいて列の名前を変更する方法はありますか? ATTRIBUTE_NAME`別用として - `column header for one and the COMPONENT_NAMEように変形上記COMPONENT_NAMEと:

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

我々はこれをしたい: は以下の表を考えます。

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. 

動的に列に名前を付ける方法はあります:現在

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

我々は、第二のテーブルを生成するために、次のですか?

+0

@GauravSoni neccessaryだろうよりもハードパースですバック。文法上の誤りや不要なインラインタグを再導入して便利なタグを削除したことはありますか? – Ben

+0

@ben:申し訳ありませんが、実際にあなたの編集部分を見たことはありません。あなたがあなたの編集でコミットしたときかもしれません。あなたの変更を元に戻すことができます。 –

答えて

2

カラム名は変数名に似ています。これはプログラムで使用される識別子です。その名前が動的に変化するのはあまり意味がありません。

各属性ごとに異なる列を使用する現在の戦略は、IMOです。

EAVデータモデルを使用することには欠点があります。

+0

同じことを実装しました。 oracleの最大列名の制限により、いくつかの列の短い別名が作成され、それらの列の名前がフロントエンドに表示される前に変更されています – RavenXV

1

あなたは、動的 SQLを構築するための第一、取得する第二(あなたが二回クエリを実行する必要があると思います

  1. しかし、あなたは、かなりのオーバーヘッドが生じているexecute a dynamic sql statement into a SYS_REFCURSOR

    にしたいです結果)

  2. あなたはより頻繁にあなたがそれを巻いている必要があります私の編集を好きではなかった場合
関連する問題