2015-10-03 9 views
1

Это мой фактический результат, и я использовал для хранения деталей клиентаПолучение нескольких значений столбцов в одной строке

SID  ATTRIBUTE_VALUES ATTRIBUTE_ID  
    ---------- ---------------- ----------- 
    20   101010    MEMBERSHIP_NO 
    20   ALLEN    MEMBERSHIP_NAME 
    20   WARD    MEMBERSHIP_LNAME 
    30   101011    MEMBERSHIP_NO 
    30   MARTIN    MEMBERSHIP_NAME 
    30   BLAKE    MEMBERSHIP_LNAME 

В этом мне нужно, чтобы получить детали не основанные на членстве, а также не используя SID. sid - уникальный номер. мне нужно показать результат как

SID MEMBERSHIP_NO MEMBERSHIP_NAME MEMBERSHIP_LNAME 
    ----- ------------- --------------- ---------------- 
    20  101010  ALLEN   WARD 
    30  101011  MARTIN   BLAKE 

Выше 3 атрибуты являются постоянными, используя это число значений только клиент, имена вставляет в таблицу. Я застрял в этом ... Мне нужно решение для этого.

Это запрос, который я использовал для получения деталей. Но он возвращается пустым

SELECT sid, LISTAGG(attribute_value, ',') WITHIN GROUP 
    (ORDER BY attribute_value) AS att FROM customer_attributes WHERE 
    sid ='20' AND attribute_value='101010' 
    AND attribute_id ='MEMBERSHIP_NO' 
    AND attribute_id ='MEMBERSHIP_NAME' 
    AND attribute_id ='MEMBERSHIP_LNAME' 
    GROUP BY SID; 

ответ

0

Вы можете сделать это join. LISTAGG обыкновение создавать 3 колонки:

select 
    a.sid, 
    a.ATTRIBUTE_VALUES MEMBERSHIP_NO, 
    b.ATTRIBUTE_VALUES MEMBERSHIP_NAME, 
    c.ATTRIBUTE_VALUES MEMBERSHIP_LNAME 
from tbl a 
join tbl b on a.sid = b.sid 
join tbl c on c.sid = b.sid 
where a.ATTRIBUTE_ID = 'MEMBERSHIP_NO' 
and b.ATTRIBUTE_ID = 'MEMBERSHIP_NAME' 
and c.ATTRIBUTE_ID = 'MEMBERSHIP_LNAME' 

Демонстрационныеsqlfiddle

Это также дает тот же результат;

select 
    sid, 
    Max(DECODE(ATTRIBUTE_ID, 'MEMBERSHIP_NO', ATTRIBUTE_VALUES, '')) MEMBERSHIP_NO, 
    Max(DECODE(ATTRIBUTE_ID, 'MEMBERSHIP_NAME', ATTRIBUTE_VALUES, '')) MEMBERSHIP_NAME, 
    Max(DECODE(ATTRIBUTE_ID, 'MEMBERSHIP_LNAME', ATTRIBUTE_VALUES, '')) MEMBERSHIP_LNAME 
from tbl 
group by sid 
order by sid 

То же самое можно сделать с помощью Pivot также

select * 
from tbl 
pivot(
    max(ATTRIBUTE_VALUES) for ATTRIBUTE_ID in (
     'MEMBERSHIP_NO' MEMBERSHIP_NO, 
     'MEMBERSHIP_NAME' MEMBERSHIP_NAME, 
     'MEMBERSHIP_LNAME' MEMBERSHIP_LNAME 
    ) 
) 
order by sid 
+0

Спасибо Praveen. Это работает для меня. –

+0

Hi praveen. Возникли небольшие проблемы. Когда я использую этот запрос, занимает довольно большое время, когда есть огромные записи. –

+0

Попробуйте новый запрос – Praveen

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