【问题标题】:"pivot" table Oracle - how to change row items into columns“透视”表Oracle - 如何将行项目更改为列
【发布时间】:2016-03-04 08:52:07
【问题描述】:

我有以下简单的例子:

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”,因为经典的旋转(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 项,并且每小时更新一次表可能会导致真正的性能问题。

【问题讨论】:

标签: sql oracle etl


【解决方案1】:

试试下面的查询;-

选择 * 从 (从 carTable 中选择汽车、物品、价值) 枢轴(最大值(值)为('车轮','颜色','价格')中的项目)

【讨论】:

  • 谢谢。它有效,但不知道为什么 - varchar 列上的最大聚合让我感到困惑......我怀疑它没有计算但必须在那里,因为必须......
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多