You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle SQL实现对手方名称、供应商与客户编号同行展示

问题描述

需要为每个对手方输出一行数据,包含名称、供应商编号(Vendor no.)、**客户编号(Customer no.)**三个独立列,但现有SQL会将每个对手方的两个编号拆分为两行显示(所有编号均存储在value列中),需修改SQL实现预期格式。

原SQL代码:

SELECT par.short_name
        ,inf.value
    FROM party_info inf
        ,party_info_types typ
        ,party par
    WHERE inf.type_id = typ.type_id
        AND inf.party_id = par.party_id
        AND typ.type_id IN (
            21185
            ,21186
            ) -- Vendor no / Customer no

解决方案1:条件聚合(兼容所有Oracle版本)

通过CASE WHEN配合聚合函数,将不同类型的编号映射到独立列,同时将旧的隐式连接改为显式JOIN提升代码可读性:

SELECT 
    par.short_name,
    MAX(CASE WHEN typ.type_id = 21185 THEN inf.value END) AS "Vendor no.",
    MAX(CASE WHEN typ.type_id = 21186 THEN inf.value END) AS "Customer no."
FROM party_info inf
JOIN party_info_types typ ON inf.type_id = typ.type_id
JOIN party par ON inf.party_id = par.party_id
WHERE typ.type_id IN (21185, 21186)
GROUP BY par.short_name;

说明:CASE WHEN会筛选出对应类型ID的编号值,MAX(或MIN,因每个对手方对应单类型编号最多一条数据)聚合后可将两行数据合并为一行。

解决方案2:使用PIVOT(Oracle 11g及以上版本)

利用Oracle原生的PIVOT语法实现行转列,代码更简洁:

SELECT 
    short_name,
    "21185" AS "Vendor no.",
    "21186" AS "Customer no."
FROM (
    SELECT 
        par.short_name,
        typ.type_id,
        inf.value
    FROM party_info inf
    JOIN party_info_types typ ON inf.type_id = typ.type_id
    JOIN party par ON inf.party_id = par.party_id
    WHERE typ.type_id IN (21185, 21186)
)
PIVOT (
    MAX(value) FOR type_id IN (21185, 21186)
);

说明:子查询先获取包含名称、类型ID、编号值的基础数据,再通过PIVOT将不同类型ID的行转为独立列,MAX聚合确保每个对手方对应唯一值。

内容的提问来源于stack exchange,提问作者Skywalker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:31:59