2016-03-04 13 views
-2

我有以下簡單的例子:「轉動」表甲骨文 - 如何更改行項目爲列

CREATE TABLE Cars (Cars, Item, Value) AS 
SELECT 'bmw',  'wheels', '4'  FROM DUAL UNION ALL 
SELECT 'bmw',  'color', 'red' FROM DUAL UNION ALL 
SELECT 'bmw',  'price', '5'  FROM DUAL UNION ALL 
SELECT 'mercedes', 'wheels', '4'  FROM DUAL UNION ALL 
SELECT 'mercedes', 'color', 'black' FROM DUAL UNION ALL 
SELECT 'lambo', 'wheels', '5'  FROM DUAL UNION ALL 
SELECT 'lambo', 'color', 'yellow' FROM DUAL UNION ALL 
SELECT 'lambo', 'price', '7'  FROM DUAL UNION ALL 
SELECT 'mercedes', 'price', '6'  FROM DUAL; 

的事情是,我需要「轉動」表來獲得項目與值列名作爲值和所有組合在一起(行與獨特的汽車名稱和單元格中沒有空值)。因此我寫了「pivot」,因爲經典pivoting(DECODE)會導致不同的結果 - 減少單元格中的歪斜值和很多空值。所以它會看起來像這樣

car  wheels color price 
-------- ------ ------ ----- 
bmw   4 red  5 
lambo   5 yellow  7 
mercedes  4 black  6 

所以問題:

我應該這樣做通過程序或者是還有什麼更好的解決方案?程序將如下(僞代碼):

1. create table cars2 /*collumns are known in before, wheels/color/price*/ 
2. get the distinct names of the cars and insert them into collection /*eg nested table*/ 
3. for each car do 
insert into table cars2 
values per item /*looping items and inserting corresponding values*/ 

好的,代碼看起來很簡單。但是,如果有超過50萬條記錄和15個條目,並且每小時更新一次表格,可能會導致真正的性能問題。

+0

的[建議在使用甲骨文透視表(可能的複製http://stackoverflow.com/ question/365238/advice-using-pivot-table-in-oracle) – Ben

回答

0

嘗試下面的查詢; -

 
    select * from 
    (select cars, item,value from carTable) 
    pivot(max(value) for item in ('wheels', 'color', 'price')) 
+0

謝謝。它的工作原理,但不知道爲什麼 - 在varchar列最大聚合混淆了我...我懷疑它不計算,但必須在那裏,因爲必須是... –

0
SELECT cars, 
     MAX(CASE item WHEN 'color' THEN value END) AS color, 
     MAX(CASE item WHEN 'price' THEN value END) AS price, 
     MAX(CASE item WHEN 'wheels' THEN value END) AS wheels 
FROM Cars 
GROUP BY cars; 

輸出

CARS  PRICE COLOR WHEELS 
-------- ----- ------ ------ 
lambo 7  yellow 5 
mercedes 6  black 4 
bmw  5  red 4