获取单行中的多个列值

时间:2015-10-03 05:28:32

标签: oracle multiple-columns listagg

这是我的实际结果,我用于客户的商店详情

    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

在此我需要根据成员资格no和使用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;

1 个答案:

答案 0 :(得分: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