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

Я хотел бы повернуть таблицу в Oracle 11g. Опция Pivot требует агрегирования. Это моя оригинальная таблица:

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'

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

 Michael-O08 июн. 2012 г., 09:06
Я предположил, что pivot используется в основном для интеллектуального анализа данных.
 Anony-Mousse08 июн. 2012 г., 00:02
Почему вы отметили этоdata-mining? Я не вижу здесь никаких вопросов по сбору данных, никакой статистики.
 Michael-O08 июн. 2012 г., 11:05
Спасибо за просвещение.
 Anony-Mousse08 июн. 2012 г., 09:21
Не за что. Интеллектуальный анализ данных - это статистика, и в основном он выполняется вне баз данных SQL, потому что это анализ только для чтения, который не требует никаких гарантий ACID.en.wikipedia.org/wiki/Pivot_table даже не упоминается «майнинг». Это, вероятно, используется в бизнес-аналитике иdata drilling, но не в реальных данных. Это «электронная таблица» Тип работы бизнес-пользователи, как правило, хорошо понимают.

Ответы на вопрос(1)

Решение Вопроса

Да, я так думаю. Это легко сделать с помощью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..

 07 июн. 2012 г., 11:56
Если у вас есть дубликаты, например,foo для того же проекта и с другой ценностью, то вам нужно взять один из них. Вы могли бы использоватьmin также. Это займетmax для на varchar стоимости.
 Michael-O07 июн. 2012 г., 11:52
КакMAX должен работать здесь? Как видите, значение имеет типVARCHAR-
 07 июн. 2012 г., 19:16
Нет проблем .. Рад помочь: D
 Michael-O07 июн. 2012 г., 18:30
Пара (проект, атрибут) уникальна. Таким образом, потеря данных не произойдет. Я оценил это на столе с & gt; 100 000 записей. Ваш запрос работает как нужно. Спасибо!

Ваш ответ на вопрос