Поворот / сводная таблица с агрегацией в 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'

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


person Michael-O    schedule 07.06.2012    source источник
comment
Почему вы пометили это интеллектуальным анализом данных? Я не вижу здесь никаких вопросов по интеллектуальному анализу данных, никакой статистики.   -  person Has QUIT--Anony-Mousse    schedule 08.06.2012
comment
Я предположил, что сводка используется в первую очередь при интеллектуальном анализе данных.   -  person Michael-O    schedule 08.06.2012
comment
Нисколько. Интеллектуальный анализ данных — это статистика, и в основном он выполняется вне баз данных SQL, потому что это анализ только для чтения, который не требует никаких гарантий ACID. en.wikipedia.org/wiki/Pivot_table даже не упоминает майнинг. Вероятно, он используется в бизнес-аналитике и детализации данных, но не в реальном анализе данных. Это тип операций с электронными таблицами, которые бизнес-пользователи, как правило, хорошо понимают.   -  person Has QUIT--Anony-Mousse    schedule 08.06.2012


Ответы (1)


Да, я так думаю. Подобный свод легко сделать с агрегатом MAX:

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

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

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..

person Arion    schedule 07.06.2012
comment
Как здесь должен работать MAX? Как видите, значение имеет тип VARCHAR- - person Michael-O; 07.06.2012
comment
Если у вас есть дубликаты, например, foo для одного и того же проекта и с другим значением, вам нужно взять один из них. Вы также можете использовать min. Это займет max для значения varchar. - person Arion; 07.06.2012
comment
Пара (проект, атрибут) уникальна. Так что потери данных не произойдет. Я оценил это на таблице с › 100 000 записей. Ваш запрос работает по желанию. Спасибо! - person Michael-O; 07.06.2012