2012-05-23 4 views
0

У меня есть данные, как это:Oracle 11g Pivot Четкие Ряды

**ATTR_ID** **ATTR_VAL** 
103   E 
104   F    
136   E 
136   U 

Я хочу, чтобы преобразовать данные в этом с помощью PIVOT:

**103**  **104**  **136** 
E   F   U 
E   F   E 

Использование MAX() в PIVOT производит одну запись. Мне нужно получить обе записи. Идентификатор атрибута может иметь несколько значений атрибутов.

SELECT * 
(SELECT ATTR_ID, ATTR_VAL FROM DATA_TABLE) 
PIVOT (MAX(ATTR_VAL) FOR ATTR_ID IN (103,104,136)) 

Я собираюсь сделать это неправильно, используя PIVOT?

+0

Почему существует второй E для 103 и второй F для 104? Эти данные не отображаются в вашем примере. Вы просто копируете его? Если в таблице 104 и 136 было две строки в таблице, как вы знаете, какие строки идут вместе на сворачиваемом выходе? Или это не имеет значения? Если у 104 было 3 строки, откуда вы знаете, нужно ли копировать U или E с 136 вниз? –

+0

Спасибо за ответ. Вы правы, данные не отображаются в образце, но я должен его создать. Другой разработчик объяснил мне, что мне нужно создать «декартовой продукт». Все данные хранятся во вложенных строках. Я должен изменить строки обратно в столбцы, чтобы я мог присоединиться к другой таблице. Означает ли это, что вы больше понимаете эту проблему? – user1413584

+0

Итак, если вы хотите декартово произведение, это означало бы, если бы было 2 строки для 103, 3 строки для 104 и 5 строк для 136, вы получили бы 2 * 3 * 5 = 30 строк. Это правильно? –

ответ

0

Если вы просто хотите декартово произведение

SELECT attr_103.attr_val as "103", 
     attr_104.attr_val as "104", 
     attr_136.attr_val as "136" 
    FROM (SELECT attr_id, attr_val 
      FROM attr_table 
     WHERE attr_id = 103) attr_103 
     CROSS JOIN 
     (SELECT attr_id, attr_val 
      FROM attr_table 
     WHERE attr_id = 104) attr_104 
     CROSS JOIN 
     (SELECT attr_id, attr_val 
      FROM attr_table 
     WHERE attr_id = 136) attr_136