【问题标题】:Getting multiple column values in single row在单行中获取多个列值
【发布时间】:2015-10-03 05:28:32
【问题描述】:

这是我的实际结果,我已用于客户的商店详细信息

    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;

【问题讨论】:

    标签: oracle multiple-columns listagg


    【解决方案1】:

    您可以通过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
    

    【讨论】:

    • 你好,普拉文。有小问题。当我使用这个查询时,当有大量记录时需要相当长的时间
    猜你喜欢
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多