Поворот / сводная таблица с агрегацией в Oracle

Я бы хотел повернуть таблицу в Oracle 11g. Параметр «свод» требует агрегации. Это моя оригинальная таблица:

project | attribute | value =========================== 'cust1' | 'foo' | '4' 'cust2' | 'bar' | 'tbd' 'cust3 | 'baz' | '2012-06-07' 'cust1' | 'bar' | 'tdsa' 'cust4' | 'foo' | '22' 'cust4' | 'baz' | '2013-01-01' 

После поворота таблица должна выглядеть так:

 project | foo | bar | baz ========================= 'cust1' | '4' |'tdba'| NULL 'cust2' | NULL|'tbd' | NULL 'cust3' | NULL| NULL | '2012-06-07' 'cust4' | '22'| NULL | '2013-01-01' 

Теперь, как вы можете видеть, группировка должна произойти над столбцом проекта. Никакие значения не должны свертываться или вычислять. Необходимо простое вращение. Итак, является ли правильный выбор правильной?

Да, я так думаю. Легко сделать такой стержень с агрегатом MAX :

 SELECT * FROM ( SELECT project, attribute, value FROM table1 ) AS SourceTable PIVOT ( MAX(value) FOR attribute IN ([foo],[bar],[baz]) ) AS pvt 

В противном случае вам нужно сделать оператор case внутри агрегата max. Как это:

 SELECT MAX(CASE WHEN attribute='foo' THEN value ELSE NULL END) AS foo, MAX(CASE WHEN attribute='bar' THEN value ELSE NULL END) AS bar, MAX(CASE WHEN attribute='baz' THEN value ELSE NULL END) AS baz, project FROM table1 GROUP BY project 

Это почти то же самое, что и PIVOT . Но я бы предпочел сделать PIVOT над CASE WHEN MAX ..