2016-03-04 46 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