복붙노트

[SQL] "피벗"테이블 오라클은 - 어떻게 컬럼에 행 항목을 변경하려면

SQL

"피벗"테이블 오라클은 - 어떻게 컬럼에 행 항목을 변경하려면

나는 다음과 같은 간단한 예제를 가지고 :

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;

문제는 내가 (독특한 차 이름과 세포에서 어떤 널 (null) 값으로 행) 그룹화 열 값과 같은 값으로 이름과 모든 것을 같은 항목을 얻을 수있는 테이블 "피벗"을 필요로한다는 것입니다. 따라서 나는 고전적인 회전 (DECODE) 리드 때문에 다른 결과로, "피벗"을 썼다 - 스큐 셀의 값과 널 (null) 값이 많이 감소. 는 것 그래서 이런 모습

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

OK, 코드는 간단한 것 같다. 그러나 이상의 레코드의 50 만 15 항목을 가지고, 그리고 한 시간에 한 번씩 테이블을 업데이트하면 실제 성능 문제가 발생할 수 있습니다.

해결법

  1. ==============================

    1.아래의 쿼리를 시도 -

    아래의 쿼리를 시도 -

      select * from
      (select cars, item,value from carTable) 
      pivot(max(value) for item in ('wheels', 'color', 'price'))
    
  2. ==============================

    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
    
  3. from https://stackoverflow.com/questions/35791681/pivot-table-oracle-how-to-change-row-items-into-columns by cc-by-sa and MIT license