2014-12-29 5 views
0

У меня есть эти таблицы:Oracle SQL группировать данные по значению

TABLE_A 

ID | ATTR_NAME | ATTR_ID | START_DATE 
------------------------------------- 
1 | XPTA  | 12  | 01-10-2013 
1 | XPTO  | 167  | 01-10-2013 
1 | XPTA  | 13  | 04-12-2013 
2 | XPTA  | 12  | 03-09-2015 
2 | XPTO  | 6  | 05-08-2012 

TABLE_B (just to help understand) 

ATTR_NAME | ATTR_ID | DESCRIPTION 
--------------------------------- 
XPTA  | 12  | ASM5 
XPTO  | 167  | weird attr 
XPTA  | 13  | DBSO12 
XPTO  | 6  | gosh... 

Есть ли способ сделать это выберите возвращение?

ID | XPTA | XPTO | START_DATE 
----------------------------- 
1 | 12 | 167 | 01-10-2013 
1 | 13 |  | 04-12-2013 
2 | 12 |  | 03-09-2015 
2 |  | 6 | 05-08-2012 

В принципе, COL1 представляет собой атрибут и COL2 значения идентификатора COL1, связанное с ID, начиная с START_DATE Примера: Ресурс Mike (ID), имеет профиль затрат (COL1) из ASM5 (COL2), начиная с 01-10-2013 (START_DATE)

Идея - группировать атрибуты по дате для каждого идентификатора.

Единственный способ я вижу, что я могу сделать это е сначала сделать выберите START_DATE, отличную от TABLE_A, а затем для каждой даты извлеченной сделать выберите ID, COL1, Col2,: date_start из TABLE_A где Дата_начала =: date_start а затем каким-то образом сделать значения COL1 моими столбцами, а COL2 - значениями моих значений.

+0

Я предполагаю 6 в последнем ряде желаемых результатов должны быть в третьем столбце, а не во втором. –

+0

Вы совершенно правы. Я извиняюсь за ошибку. Исправлена. – FEST

ответ

2

Предполагая, что я понять ваш вопрос правильно, вы ищете условную агрегацию, то вы можете сделать с max и case:

select id, 
    max(case when attr_name = 'XPTA' then attr_id end) xpta, 
    max(case when attr_name = 'XPTO' then attr_id end) xpto, 
    start_date 
from table_a 
group by id, start_date 
+0

Спасибо @sgedded, это намного проще, чем я думал. Мне все еще неловко эта мысль, но я думаю, что понимаю. – FEST

Смежные вопросы